CABasicAnimation的基本使用方法(移动·旋转·放大·缩小)


所谓关键帧动画,就是将Layer的属性作为KeyPath来注册,指定动画的起始帧和结束帧,然后自动计算和实现中间的过渡动画的一种动画方式。
CABasicAnimation的基本使用顺序
1.引用QuartzCore.framework
将"QuartzCore.framework"这个库添加到项目中。并且在需要使用CABaseAnimation类的地方import头文件。
-
#import
2.CABaseAnimation的实例化以及关键路径的注册
使用"animationWithKeyPath:"方法进行CABasicAnimation的实例化,并指定Layer的属性作为关键路径来注册。
-
//
指定position属性 -
CABasicAnimation
*animation = -
[CABasicAnimation animationWithKeyPath :@"position"];
3.设定动画
设定动画的属性。以下是属性及其对应的说明:
属性 | 说明 |
---|---|
duration | 动画时长(秒为单位)(注:此处与原文有出入) |
repeatCount | 重复次数。永久重复的话设置为HUGE_VALF。 |
beginTime |
指定动画开始时间。从开始指定延迟几秒执行的话,请设置为 「CACurrentMediaTime() + 秒数」的形式。 |
timingFunction | 设定动画的速度变化 |
autoreverses | 动画结束时是否执行逆动画 |
-
animation.duration
= 2.5;// 动画持续时间 -
animation.repeatCount
= 1;// 不重复 -
animation.beginTime
= 2;CACurrentMediaTime() + // 2秒后执行 -
animation.autoreverses
= YES;// 结束后执行逆动画 -
-
//
动画先加速后减速 -
animation.timingFunction
= -
[CAMediaTimingFunction functionWithName :kCAMediaTimingFunctionEa ];seInEaseOut
4.设定动画的开始帧和结束帧
设定动画开始和结束帧时的状态。设定的值会变为KeyPath所指定的属性的值。
属性 | 说明 |
---|---|
fromValue | 开始值 |
toValue | 终了值(絶対値) |
byValue | 终了值(相对值) |
-
//
指定position属性(移动) -
CABasicAnimation
*animation = -
[CABasicAnimation animationWithKeyPath :@"position"]; -
-
???
-
-
//
设定动画起始帧和结束帧 -
animation.fromValue
= [NSValue valueWithCGPoint :CGPointMake(0,0)]; // 起始点 -
animation.toValue
= [NSValue valueWithCGPoint :CGPointMake(320,480)]; // 终了点
5.添加动画
为Layer添加设置完成的动画,可以给Key指定任意名字。
-
[myView.layer
addAnimation :animationforKey :@"move-layer"];
其他.动画结束后回到初始状态的现象的解决方法
用CABasicAnimation执行动画,在动画结束后会回归动画开始前的状态。想要解决的话,必须设置“removedOnCompletion”和“fillMode”这两个属性。
-
//
动画终了后不返回初始状态 -
animation.removedOnCompletion
= NO; -
animation.fillMode
= kCAFillModeForwards;
CABasicAnimation的使用示例
实际上CABasicAnimation有很多种使用方法,以下将一一列举。
移动动画
-
-
CABasicAnimation
*animation = [CABasicAnimation animationWithKeyPath :@"position"]; -
-
//
动画选项的设定 -
animation.duration
= 2.5;// 持续时间 -
animation.repeatCount
= 1;// 重复次数 -
-
//
起始帧和终了帧的设定 -
animation.fromValue
= [NSValue valueWithCGPoint :myView.layer.position];// 起始帧 -
animation.toValue
= [NSValue valueWithCGPoint :CGPointMake(320,480)]; // 终了帧 -
-
//
添加动画 -
[myView.layer
addAnimation :animationforKey :@"move-layer"];
旋转动画
-
-
-
//
对Y轴进行旋转(指定Z轴的话,就和UIView的动画一样绕中心旋转) -
CABasicAnimation
*animation = [CABasicAnimation animationWithKeyPath :@"transform.rotation.y"]; -
-
//
设定动画选项 -
animation.duration
= 2.5;// 持续时间 -
animation.repeatCount
= 1;// 重复次数 -
-
//
设定旋转角度 -
animation.fromValue
= [NSNumber numberWithFloat :0.0];// 起始角度 -
animation.toValue
= [NSNumber numberWithFloat :22* M_PI ];// 终止角度 -
-
//
添加动画 -
[myView.layer
addAnimation :animationforKey :@"rotate-layer"];
缩放动画
-
-
-
//
设定为缩放 -
CABasicAnimation
*animation = [CABasicAnimation animationWithKeyPath :@"transform.scale"]; -
-
//
动画选项设定 -
animation.duration
= 2.5;// 动画持续时间 -
animation.repeatCount
= 1;// 重复次数 -
animation.autoreverses
= YES;// 动画结束时执行逆动画 -
-
//
缩放倍数 -
animation.fromValue
= [NSNumber numberWithFloat :1.0];// 开始时的倍率 -
animation.toValue
= [NSNumber numberWithFloat :2.0];// 结束时的倍率 -
-
//
添加动画 -
[myView.layer
addAnimation :animationforKey :@"scale-layer"];
组合动画
使用CAAnimationGroup类进行复数动画的组合。代码如下:
-
-
CABasicAnimation
*animation 1= -
[CABasicAnimation animationWithKeyPath :@"transform.translation.x"]; -
-
//
终点设定 -
animation1.toValue
= [NSNumber numberWithFloat :80];;// 終点 -
-
-
-
CABasicAnimation
*animation 2= -
[CABasicAnimation animationWithKeyPath :@"transform.rotation.z"]; -
-
//
设定旋转角度 -
animation2.fromValue
= [NSNumber numberWithFloat :0.0];// 开始时的角度 -
animation2.toValue
= [NSNumber numberWithFloat :44* M_PI ];// 结束时的角度 -
-
-
-
CAAnimationGroup
*group = [CAAnimationGroup animation ]; -
-
//
动画选项设定 -
group.duration
= 3.0; -
group.repeatCount
= 1; -
-
//
添加动画 -
group.animations
= [NSArray arrayWithObjects :animation1,animation 2,nil nil ]; -
[myView.layer
addAnimation :groupforKey :@"move-rotate-layer"];
捕获动画开始时和终了时的事件
博主:设定委托对象,实现委托方法,如下:
-
-
CABasicAnimation
*animation = [CABasicAnimation animationWithKeyPath :@"transform.translation.y"]; -
animation.delegate
= self;// 指定委托对象 -
-
//
设定动画选项 -
animation.duration
= 2.5;// 动画时长 -
animation.repeatCount
= 1;// 重复次数 -
-
//
终点设定 -
animation.toValue
= [NSNumber numberWithFloat :100];;// 终点 -
-
//
添加动画 -
[myView.layer
addAnimation :animationforKey :@"move-layer"]; -
-
???
-
-
-
-
(void)animationDidStart:(CAAnimation *)theAnimation -
{
-
NSLog(@"begin"); -
}
-
-
-
-
(void)animationDidStop:(CAAnimation *)theAnimation finished :(BOOL)flag -
{
-
NSLog(@"end"); -
}
CABasicAnimation使用时候的注意点
CABasicAnimation正在进行动画的时候,点击了Home按钮后再回到app的时候,动画会被清空。
Objective-C的示例程序
使用CABasicAnimation实现关键帧动画的示例程序如下:
-
-
( void)viewDidLoad -
{
-
[super viewDidLoad ]; -
-
// 图像显示 -
UIImage *image = [UIImage imageNamed :@"image01.png"]; -
UIImageView *imageView = [[UIImageView alloc ]initWithImage:image]; -
imageView.center = 160,CGPointMake( 240); -
[self.view addSubview :imageView]; -
-
-
-
CABasicAnimation *animation 1= -
[CABasicAnimation animationWithKeyPath :@"transform.translation.y"]; -
-
// 起止点的设定 -
animation1.toValue = [NSNumber numberWithFloat :100];;// 終点 -
-
-
-
CABasicAnimation *animation 2= -
[CABasicAnimation animationWithKeyPath :@"transform.rotation.x"]; -
-
// 绕x轴转3圈 -
animation2.toValue = [NSNumber numberWithFloat :66* M_PI ];// 结束时的角度 -
-
-
-
CAAnimationGroup *group = [CAAnimationGroup animation ]; -
group.delegate = self; -
group.duration = 5.0; -
group.repeatCount = 1; -
-
// 动画结束后不变回初始状态 -
group.removedOnCompletion = NO; -
group.fillMode = kCAFillModeForwards; -
-
// 添加动画 -
group.animations = [NSArray arrayWithObjects :animation1,animation 2,nil nil ]; -
[imageView.layer addAnimation :groupforKey :@"move-rotate-layer"]; -
}
-
-
-
-
-
(void)animationDidStart:(CAAnimation *)theAnimation -
{
-
NSLog(@"begin"); -
}
-
-
-
-
(void)animationDidStop:(CAAnimation *)theAnimation finished :(BOOL)flag -
{
-
NSLog(@"end"); -
}
示例程序的执行结果
Objective-C的示例程序的执行结果如下:
http://img.blog.csdn.net/20131107225956000
控制台输出如下: