IOS开发 CAKeyframeAnimation

-(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];

    

    

}

/*

 1path属性

 作用与values属性一样,同样是用于指定整个动画所经过的路径的。需要注意的是,valuespath是互斥的,当valuespath同时指定时,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);

 

 2timeFunctions属性

 

 用过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;

  }

 

 */


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值