`
java-mans
  • 浏览: 11710989 次
文章分类
社区版块
存档分类
最新评论

iphone练习之animation使球移动、旋转、放大(transtion,rotation,scaling)

 
阅读更多

先展示实现效果:


第一种方法:

1、首先创建一个基视图的项目并命名为:AnimationTest

打开ViewController.xib文件,拖一个Image View、label和一个slider,imageView放在中间,其它两个放在屏幕的下面;

2、在ViewController.h文件中创建如下代码:

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController{
    IBOutlet UIImageView *imageView;//图片
    IBOutlet UISlider *slider;//滑块条
    
    CGPoint delta;//坐标
    NSTimer *timer;//时间
    float cellR;//球的半径
    
    
}
@property (nonatomic,retain)IBOutlet UIImageView *imageView;
@property (nonatomic,retain)IBOutlet UISlider *slider;
//当滑块条移动的时候
-(IBAction)sliderMoved:(id)sender;
@end

并且把所有的控件相应的都对应上,这个相信大家都知道了!!

3、ViewContoller.m文件实现

#import "ViewController.h"

@implementation ViewController
@synthesize imageView,slider;

- (void)viewDidLoad
{
    //得到球的半径
    cellR=imageView.frame.size.width/2;
    //滑动块在右旁显示值
    [slider setShowValue:YES];
    //初始化要移动的坐标
    delta=CGPointMake(12.0, 4.0);
    //scheduledTimerWithTimeInterval:参数指定秒计时器之间发射。它接受一个0.0-1.0秒的值,selector:参数指定定时器触发时要调用的方法,repeats:参数表示计时器对象是否会反复重新安排本身。
    timer=[NSTimer scheduledTimerWithTimeInterval:slider.value target:self selector:@selector(onTimer) userInfo:nil repeats:YES];
    
    [super viewDidLoad];
	// Do any additional setup after loading the view, typically from a nib.
}
//每次调用都让球移动,并判断是否接触到屏幕边缘
-(void)onTimer{
    //球中心的x轴加delta.x,y轴加delta.y来使球移动
    imageView.center=CGPointMake(imageView.center.x+delta.x,imageView.center.y+delta.y);
    //如果球中心的x轴超过了屏幕的宽度或者球的x轴小于了半径就把delta.x改成相反
    if(imageView.center.x>self.view.bounds.size.width-cellR||imageView.center.x<cellR){
        delta.x=-delta.x;
    }
    //如果球中心的y轴超过了屏幕的高度或者球的y轴小于了半径就把delta.y改成相反
    if(imageView.center.y>self.view.bounds.size.height-cellR||imageView.center.y<cellR){
        delta.y=-delta.y;
    }
}
//当你改变slider,该方法将被调用
-(IBAction)sliderMoved:(id)sender{
    //把以前的timer设为无效,只有设为无效也,才能改变它的发身间隔频率,你不能直接改变他的间隔
    [timer invalidate];
    //然后重新创建timer
    timer=[NSTimer scheduledTimerWithTimeInterval:slider.value target:self selector:@selector(onTimer) userInfo:nil repeats:YES];
    
}
-(void)dealloc{
    [timer invalidate];
    [imageView release];
    [slider release];
    [super dealloc];
}

第二种方法:

为了使画面更流畅,我们要用到animation,在原先项目的基础上添加如下代码

首先在ViewController.h文件添加:

CGPoint​ translation;

在ViewController.m中的VieDidLoad中初始化:

 //初始化
    translation=CGPointMake(0.0, 0.0);

把onTimer方法改成如下:

/每次调用都让球移动,并判断是否接触到屏幕边缘
-(void)onTimer{
    //UIView开始动画
    [UIView beginAnimations:@"my_own_animation" context:nil];
    //设置动画移动的时间为slider.value滑块的值
    [UIView setAnimationDuration:slider.value];
    //设置动画曲线类形为:直线UIViewAnimationCurveLinear
    [UIView setAnimationCurve:UIViewAnimationCurveLinear];
    //在视图上执行仿射变换,简单地使用它的变换属性:设置动画移动值
    imageView.transform=CGAffineTransformMakeTranslation(translation.x, translation.y);
    //完成动画,必须写,不要忘了
    [UIView commitAnimations];
    
    //移动值的变化
    translation.x+=delta.x;
    translation.y+=delta.y;
    //是否超出范围
    if(imageView.center.x+translation.x>self.view.bounds.size.width-cellR||imageView.center.x+translation.x<cellR){
        delta.x=-delta.x;
    }
    if(imageView.center.y+translation.y>self.view.bounds.size.width-cellR||imageView.center.y+translation.y<cellR){
        delta.y=-delta.y;
    }
}

这样画面就更加流畅了!!

下面实现球旋转效果

还是在原来的项目基础上添加代码:

首先在ViewController.h文件添加:

//旋转的值
    float angle;

在ViewController.m中的VieDidLoad中初始化:

angle=0;

把onTimer方法改成如下:

//每次调用都让球移动,并判断是否接触到屏幕边缘
-(void)onTimer{
   
    //UIView开始动画
    [UIView beginAnimations:@"my_own_animation" context:nil];
    //设置动画移动的时间为slider.value滑块的值
    [UIView setAnimationDuration:slider.value];
    //设置动画曲线类形为:直线UIViewAnimationCurveLinear
    [UIView setAnimationCurve:UIViewAnimationCurveLinear];
   
    //旋转效果
    imageView.transform=CGAffineTransformMakeRotation(angle);
    //完成动画,必须写,不要忘了
    [UIView commitAnimations];
    //改变angle的值,angle是弧度值,1弧度值是57.32度,每次都旋转0.1弧度值,你要是想效果明显就把值设大一点
    angle += 0.1;
    if (angle>6.2857) angle = 0;
//球中心的x轴加delta.x,y轴加delta.y来使球移动(第一种方法)
    imageView.center=CGPointMake(imageView.center.x+delta.x,imageView.center.y+delta.y);
    //如果球中心的x轴超过了屏幕的宽度或者球的x轴小于了半径就把delta.x改成相反
    if(imageView.center.x>self.view.bounds.size.width-cellR||imageView.center.x<cellR){
        delta.x=-delta.x;
    }
    //如果球中心的y轴超过了屏幕的高度或者球的y轴小于了半径就把delta.y改成相反
    if(imageView.center.y>self.view.bounds.size.height-cellR||imageView.center.y<cellR){
        delta.y=-delta.y;
    }
    
}
旋转效果实现!就是只加了一个imageView.transform=CGAffineTransformMakeRotatin(angle),该方法的目地是设置它的旋转效果;

接下来是放大效果:

在上面代码里只加一句:

imageView.transform=CGAffineTransformMakeScale(angle, angle);
该语句是实现放大效果,x和y轴放在angle倍;

ok!实现!本博客是我自己的练习,有好多地方没有讲太清楚,还请谅解!


分享到:
评论

相关推荐

    css-animation-transtion-demo

    在"css-animation-transtion-demo"项目中,你可以期待看到各种过渡和动画效果的实例,包括淡入淡出、滑动、旋转等。这些示例将帮助开发者了解如何在实际项目中应用CSS动画和过渡,提升用户体验。同时,通过查看源...

    CSS3汉堡包图标变形动画按钮.zip

    汉堡包图标通常由三条平行的线条组成,代表着菜单或导航的隐藏状态,常用于移动设备和响应式设计中。在网页设计中,这个图标经常被用来触发侧边栏或导航菜单的显示和隐藏。 在"CSS3汉堡包图标变形动画按钮.zip"这个...

    详解CSS背景渐变图片transtion过渡效果技巧

    这里,`background`属性同时设置了颜色(olive)和一个透明度渐变,当鼠标悬停时,`background-color`变为紫色,渐变颜色也随之改变,从而实现过渡效果。 四、利用伪元素和`opacity`实现渐变过渡 最后,我们还可以...

    css3Transition主要效果平缓过渡

    Transition主要效果平缓过渡,是css3的一个重要样式效果,提供了许多的过渡方式。

    802.11r BSS Fast Transition Deployment Guide

    客户端漫游过程中,使用FT协议从当前AP移动到目标AP的整个过程中,消息交换是通过以下两种方法之一完成的: 1. 无线空中漫游:客户端使用带有FT认证算法的IEEE 802.11认证与目标AP直接通信进行漫游配置时的消息交换...

    android实现文字跳动

    Android提供了多种动画类型,包括补间动画(Tween Animation)、帧动画(Frame Animation)以及属性动画(Property Animation)。对于文字跳动的效果,最适合使用属性动画,因为它可以改变对象的属性并实时更新视图...

    swift-View2ViewTransition简单的框架实现两个视图切换及转场

    在Swift编程中,视图(View)之间的切换和转场是构建用户界面的重要部分,尤其在iOS应用开发中。`View2ViewTransition`框架提供了一种简单的方法来实现在两个视图之间平滑过渡,而无需深入理解复杂的动画和转场API。...

    jQuery实现点击旋转,再点击恢复初始状态动画效果示例

    本文实例讲述了jQuery实现点击旋转,再点击恢复初始状态动画效果。分享给大家供大家参考,具体如下: ... &lt;div class=box&gt;&lt;/div&gt; &lt;!--需要加一个初始状态--&gt; ....rotate1{ //旋转后的位置 ... transtion:all .3s l

    ScreenTransition:Android 转场动画

    在Android开发中,屏幕间的转场动画(Screen ...熟练掌握这些技巧,可以使应用的用户体验提升到一个新的层次。在实际项目中,开发者应根据应用的风格和用户需求,灵活运用转场动画,创造出独特且吸引人的交互体验。

    obs-move-transition:移动OBS Studio的过渡

    移动OBS Studio的过渡OBS Studio插件,可在场景转换期间将源移动到新位置下载建造建立OBS Studio: :检出此存储库以进行插件/移动转换将add_subdirectory(move-transition)添加到plugins / CMakeLists.txt重建OBS ...

    最新CSS3学习视频教程 33讲完整版 后盾网CSS3视频教程

    ├07 用transtion属性实现动画效果.mp4 ├08 元素变化transform rotate translate scale skew.mp4 ├09 京东闪光效果的实现.mp4 ├10 用animation和keyframes实现动画.mp4 ├11 漂亮的时钟秒针旋转效果.mp4 ├12 微...

    Vue 过渡(动画)transition组件案例详解

    Vue过度(动画),本质走的是CSS3:transtion,animation。 控制器div显示/隐藏,代码如下: &lt;input type=button value=按钮 @click=toggle&gt; &lt;div id=div1 v-show=isShow&gt;&lt;/div&gt; [removed] var vm = ...

    19_Vue3-实现过渡动画.pptx

    如果我们添加了一个 name 属性,比如 &lt;transtion name="why"&gt;,那么所有的 class 会以 why- 开头。 此外,我们还可以通过 animation 来实现动画效果。Vue 可以自动识别动画类型,并设置监听 transitionend 或 ...

    iOS7 ViewController转场

    例如,可以设计一个从上至下滑动的转场,或者带有特殊视觉特效的转场,如缩放、旋转等。 3. **自定义Present和Dismiss** 类似地,若要自定义模态视图控制器的呈现和消失动画,我们需要实现...

    shared-element-transitions:用于React,Vue和Angular的路由器之间的共享元素转换

    Flutter的Hero动画和其他移动应用程序提供的想法。安装Reactyarn add react - shared - element Vue yarn add vue - shared - element使用两条路由都使用SharedElement组件,并且ID必须相同。它可以是动态ID,并...

    transition.js

    作为一个JavaScript库,它的目标是简化过渡效果的实现,让开发者无需深入了解CSS3的transition或animation,也能轻松创建出专业级别的过渡动画。 二、主要功能 1. **支持多种过渡属性**:transition.js 支持对CSS...

    基于css3的属性transition制作菜单导航效果

    【CSS3的`transition`属性】是现代网页设计中用于创建平滑过渡效果的关键特性。这个属性允许元素从一种样式逐渐变化到另一种样式,而不仅仅局限于颜色、尺寸或位置等单一属性的改变。在本例中,`transition`被用来...

    vue移动端实现手机左右滑动入场动画

    本文实例为大家分享了vue移动端实现手机左右滑动入场的具体代码,供大家参考,具体内容如下 app.vue $route.meta.keepAlive class=Router&gt; &lt;router-view v-if=!$rout

    关于vue状态过渡transition不起作用的原因解决

    关于Vue状态过渡(transition)不起作用的问题及解决方法涉及的多个知识点,主要包括以下几点: 1. Vue中transition的使用方法:在Vue中,transition标签用于为单个元素或组件添加进入/离开过渡效果。...

Global site tag (gtag.js) - Google Analytics