码迷,mamicode.com
首页 > 其他好文 > 详细

核心动画的接触点滴(三)

时间:2016-05-30 20:07:53      阅读:135      评论:0      收藏:0      [点我收藏+]

标签:核心动画   帧动画   cakeyframeanimation   

本篇记录的是核心动画的中的CApropertyAnimation中的关键帧动画部分。非常有用:

关键帧动画是CApropertyAnimation的子类,跟CABasicAnimation的区别是:CABasicAnimation只能从一个数值(fromValue)变到另一个数值(toValue),而CAKeyframeAnimation会使用一个NSArray保存这些数值

属性解析:

values:就是上述的NSArray对象。里面的元素称为”关键帧”(keyframe)。动画对象会在指定的时间(duration)内,依次显示values数组中的每一个关键帧

path:可以设置一个CGPathRef\CGMutablePathRef,让层跟着路径移动。path只对CALayer的anchorPoint和position起作用。如果你设置了path,那么values将被忽略

keyTimes:可以为对应的关键帧指定对应的时间点,其取值范围为0到1.0,keyTimes中的每一个时间值都对应values中的每一帧.当keyTimes没有设置的时候,各个关键帧的时间是平分的说明:CABasicAnimation可看做是最多只有2个关键帧的CAKeyframeAnimation

第一种使用方法:

//给指定view添加关键帧动画(使用帧数组的方式)

-(void)addKeyFrameAnimationOnView:(UIView *)view

{


    //1.创建核心动画(帧动画)

    CAKeyframeAnimation *keyAnima=[CAKeyframeAnimation animation];

    //使用平移的方式//平移

    keyAnima.keyPath=@"position";

    //告诉系统要执行什么动画

    NSValue *value1=[NSValue valueWithCGPoint:CGPointMake(100, 100)];

    NSValue *value2=[NSValue valueWithCGPoint:CGPointMake(200, 100)];

    NSValue *value3=[NSValue valueWithCGPoint:CGPointMake(200, 200)];

    NSValue *value4=[NSValue valueWithCGPoint:CGPointMake(100, 200)];

    NSValue *value5=[NSValue valueWithCGPoint:CGPointMake(100, 100)];

    //加入帧动画数组

    keyAnima.values=@[value1,value2,value3,value4,value5];

    //设置动画执行完毕后,不删除动画

    keyAnima.removedOnCompletion=NO;

    //设置保存动画的最新状态

    keyAnima.fillMode=kCAFillModeForwards;

    //设置动画执行的时间

    keyAnima.duration=1.0;

    //设置动画的节奏(开始和结束时的快慢)

    keyAnima.timingFunction=[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];

    

    //设置代理,开始结束


    [view.layer addAnimation:keyAnima forKey:nil];


}


可以看得出来,这个和之前的基本动画里的平移动画类似,只不过它的value变成了一个数组了,其中设置的动画的执行节奏有如下几种:(可以自己去尝试)

    kCAMediaTimingFunctionLinear

    kCAMediaTimingFunctionEaseIn

    kCAMediaTimingFunctionEaseOut

    kCAMediaTimingFunctionEaseInEaseOut

    kCAMediaTimingFunctionDefault


第二种方法(使用path),让layer在指定的路径上移动


-(void)addKeyFrameAnimationOnView2:(UIView *)view

{


    CAKeyframeAnimation *keyAnima = [CAKeyframeAnimation animation];

    keyAnima.keyPath = @"position";

    keyAnima.duration = 1.0f;

    

    //创建一条路径

    CGMutablePathRef path = CGPathCreateMutable();

    //设置一个圆的路径

    CGPathAddEllipseInRect(path, NULL, CGRectMake(Width/2, Height/2+100, 50, 50));

    keyAnima.path = path;   //记得一定要设置

    

    //release

    CGPathRelease(path);

    

    //取消执行完后移除动画

    keyAnima.removedOnCompletion = NO;

    //设置保存动画的最新状态

    keyAnima.fillMode = kCAFillModeForwards;

    //设置动画的节奏(这里选择渐入渐出)

    keyAnima.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];

    

    [view.layer addAnimation:keyAnima forKey:nil];


}


停止动画调用方法: removeAnimationForKey:即可(前提是要知道需要停止的动画之前被赋予的key,才能匹配并停止)


视图的抖动:

//给指定视图

 #define angle2Radian(angle)  ((angle)/180.0*M_PI)  //获取自定义弧度

添加抖动动画

-(void)addRotationAnimationOnView:(UIView *)view

{


    CAKeyframeAnimation *keyAnima = [CAKeyframeAnimation animation];

    keyAnima.keyPath = @"transform.rotation";

    

    keyAnima.duration = 0.1f;

    

    //设置视图的抖动弧度(其实还是帧动画)

    CGFloat  angel = 5.0;

    keyAnima.values=@[@(-angle2Radian(angel)),@(angle2Radian(angel)),@(-angle2Radian(angel))];

    

    keyAnima.removedOnCompletion = YES;

    

    keyAnima.repeatCount = 2;

    

    keyAnima.fillMode = kCAFillModeForwards;

    

    [view.layer addAnimation:keyAnima forKey:nil];


}


写法跟帧动画没有太大区别,只是要设置一下重复的次数和完成后移除动画


本文出自 “11562149” 博客,请务必保留此出处http://11572149.blog.51cto.com/11562149/1784553

核心动画的接触点滴(三)

标签:核心动画   帧动画   cakeyframeanimation   

原文地址:http://11572149.blog.51cto.com/11562149/1784553

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!