您的位置:首页 > 移动开发 > IOS开发

IOS开发 CAKeyframeAnimation

2015-12-29 16:46 393 查看
-(void)creatKeyAnimation{

//初始化演员

CALayer *rectLayer = [[CALayer
alloc] init];

rectLayer.frame =
CGRectMake(15,
200, 30, 30);

rectLayer.cornerRadius =
15;

rectLayer.backgroundColor = [UIColor
blackColor].CGColor;

[self.view.layer
addSublayer:rectLayer];

//剧本

CAKeyframeAnimation *rectRunAnimation = [CAKeyframeAnimation
animationWithKeyPath:@"position"];

//values属性指明整个动画过程中的关键帧点,需要注意的是,起点必须作为values的第一个值。

rectRunAnimation.values =
@[

[NSValue
valueWithCGPoint:rectLayer.frame.origin],

[NSValue
valueWithCGPoint:CGPointMake(self.view.frame.size.width
- 15, rectLayer.frame.origin.y)],

[NSValue
valueWithCGPoint:CGPointMake(self.view.frame.size.width
- 15, rectLayer.frame.origin.y +
100)],

[NSValue
valueWithCGPoint:CGPointMake(15, rectLayer.frame.origin.y +
100)],

[NSValue
valueWithCGPoint:rectLayer.frame.origin]

];

//谁知每个关键帧的时长,如果没有显示的设置,则默认每个帧的时间
= 总duration / (values.count - 1);
这个不是每段动画的执行时间 而是
总的执行时间 慢慢增加的
第一段时间为 0.6 第二段为 0.1
第三段为0.1 第四段为 0.2
首尾必须分别是 0 和 1

rectRunAnimation.keyTimes =
@[

[NSNumber
numberWithFloat:0.0],

[NSNumber
numberWithFloat:0.6],

[NSNumber
numberWithFloat:0.7],

[NSNumber
numberWithFloat:0.8],

[NSNumber
numberWithFloat:1.0]

];

rectRunAnimation.timingFunctions =
@[

[CAMediaTimingFunction
functionWithName:kCAMediaTimingFunctionLinear],

[CAMediaTimingFunction
functionWithName:kCAMediaTimingFunctionLinear],

[CAMediaTimingFunction
functionWithName:kCAMediaTimingFunctionLinear],

[CAMediaTimingFunction
functionWithName:kCAMediaTimingFunctionLinear],

];

//动画次数
无限

rectRunAnimation.repeatCount =
MAXFLOAT;

//动画回放

rectRunAnimation.autoreverses =
NO;

//该属性决定了物体在每个子路径下是跳着走还是匀速走,跟timeFunctions属性有点类似 kCAAnimationDiscrete//离散,无中间过程,但keyTimes设置的时间依旧生效,物体跳跃地出现在各个关键帧上

rectRunAnimation.calculationMode =
kCAAnimationLinear;

rectRunAnimation.duration =
4;

[rectLayer addAnimation:rectRunAnimation
forKey:nil];

}

/*

(1)path属性

作用与values属性一样,同样是用于指定整个动画所经过的路径的。需要注意的是,values与path是互斥的,当values与path同时指定时,path会覆盖values,即values属性将被忽略。例如上述例子等价于代码中values方式的path设置方式为:

1 CGMutablePathRef path = CGPathCreateMutable();

2 CGPathMoveToPoint(path, NULL, rectLayer.position.x - 15, rectLayer.position.y - 15);

3 CGPathAddLineToPoint(path, NULL, 320 - 15, rectLayer.frame.origin.y);

4 CGPathAddLineToPoint(path, NULL, 320 - 15, rectLayer.frame.origin.y + 100);

5 CGPathAddLineToPoint(path, NULL, 15, rectLayer.frame.origin.y + 100);

6 CGPathAddLineToPoint(path, NULL, 15, rectLayer.frame.origin.y);

7 rectRunAnimation.path = path;

8 CGPathRelease(path);

(2)timeFunctions属性

用过UIKit层动画的同学应该对这个属性不陌生,这个属性用以指定时间函数,类似于运动的加速度,有以下几种类型。上例子的AB段就是用了淡入淡出效果。记住,这是一个数组,你有几个子路径就应该传入几个元素

1 kCAMediaTimingFunctionLinear//线性

2 kCAMediaTimingFunctionEaseIn//淡入

3 kCAMediaTimingFunctionEaseOut//淡出

4 kCAMediaTimingFunctionEaseInEaseOut//淡入淡出

5 kCAMediaTimingFunctionDefault//默认

此外,动画的暂停与开始可以通过下面的方式做到:

-(void)pauseLayer:(CALayer*)layer

{

CFTimeInterval pausedTime = [layer convertTime:CACurrentMediaTime() fromLayer:nil];

layer.speed = 0.0;

layer.timeOffset = pausedTime;

}

-(void)resumeLayer:(CALayer*)layer

{

CFTimeInterval pausedTime = [layer timeOffset];

layer.speed = 1.0;

layer.timeOffset = 0.0;

layer.beginTime = 0.0;

CFTimeInterval timeSincePause = [layer convertTime:CACurrentMediaTime() fromLayer:nil] - pausedTime;

layer.beginTime = timeSincePause;

}

*/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: