隐式动画和核心动画

旧巷老猫 提交于 2020-04-04 18:53:33

1. 

隐式动画,只有非根层的CALayer才有隐式动画,即改变图层的属性的时候,比如大小,颜色等,会自动添加一个颜色效果,

  根层:控件里面的CALayer

  非根层:自己创建的CALayer,不依附控件存在的CALayer

隐式动画的使用场景不多

2. 核心动画:

Core Animation是一组非常强大的动画处理API,使用它能做出非常炫丽的动画效果,而且往往是事半功倍。也就是说,使用少量的代码就可以实现非常强大的功能。Core Animation可以用在Mac OS X和iOS平台。Core Animation的动画执行过程都是在后台操作的,不会阻塞主线程。

要注意的是,Core Animation是直接作用在CALayer上的,并非UIView。CALayer中很多属性都可以通过CAAnimation实现动画效果,包括:opacity、position、transform、bounds、contents等,通过调⽤用CALayer的addAnimation:forKey增加动画到层(CALayer)中,这样就能触 发动画了。

CAAnimation的继承结构如下:

注意:

 这个核心动画仅仅是一个效果,动画结束之后并不保存动画结束之后的值,要想保存动画结束之后的值,两种方案

     1.使用animationstop方法(CAAnimation的代理方法),设置相应属性的值为动画结束后的值(或者在动画执行完毕后的代码里面添加动画完成之后的结果的代码)

     2.设置动画的属性

        removedOnCompletion:动画对象是否移除,默认是移除

        fillMode:确定该对象的状态在非action段的状态,比如是动画之前的,还是动画之后的

示例:

//保留动画之后的状态

    animation.removedOnCompletion = NO;

    animation.fillMode = kCAFillModeForwards;

 

1>CABasicAnimation

    CABasicAnimation *basicamt = [CABasicAnimation animation];

    //设置动画的属性,比如ToValue,fromValue,还有duration,keypath等等

       //设置代理,控制器就不用再添加遵循CAAnimationDelegate的代码了,系统默认添加过了

      basicamt.delegate = self;    

    //keypath表示动画效果是改变的layer的哪个属性

    basicamt.keyPath = @"bounds";

    //fromValue,toValue分别表示keyPath属性从哪个值开始到哪个值结束,参数是oc对象,所以要将CGRect数据包装成oc对象

    basicamt.toValue = [NSValue valueWithCGRect:CGRectMake(0, 0, 300, 200)];

    basicamt.removedOnCompletion = NO;

    basicamt.fillMode = kCAFillModeForwards;

    //添加到layer

    [self.imageview.layer addAnimation:basicamt forKey:nil];

 

2>CAKeyframeAnimation

//帧动画使用示例

    CAKeyframeAnimation *keyframeanimation = [CAKeyframeAnimation animation];

    //设置values数组,由几个点构成,这里构造四个位置点,作为动画的运动路径

    /*

     运动的路径,是layer的中心点沿着路径做运动,所以起始点应该是中心点

     */

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

    NSValue *value2 =[NSValue valueWithCGPoint:CGPointMake(300, 50)];

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

    NSValue *value4 =[NSValue valueWithCGPoint:CGPointMake(50, 300)];

    

    //数组里面只能放oc对象,所以要把CGPoint值封装成NSValue对象

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

    

    //设置动画时间

    keyframeanimation.duration = 5;

    

    //设置运动的 方式属性 timingFunction,动画的运动方式

    //是CAMediaTimingFunction类的,并不是枚举类型

    /*

      kCAMediaTimingFunctionLinear  匀速

      kCAMediaTimingFunctionEaseIn  先慢后快

      kCAMediaTimingFunctionEaseOut  先快后慢

      kCAMediaTimingFunctionEaseInEaseOut  两头慢,中间快

      kCAMediaTimingFunctionDefault  默认

     */

    keyframeanimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseIn];

    

    //还有一种方法通过path设置路径

    //创建path

    CGMutablePathRef path = CGPathCreateMutable();

    //在路径上添加一个圆

    CGFloat screenW = [UIScreen mainScreen].bounds.size.width;

    CGPathAddEllipseInRect(path, NULL, CGRectMake(0, 0, screenW, screenW));

     //设置动画的path属性

    keyframeanimation.path = path;

    

    //c 语言资源create,copy,new等创建的对象要手动销毁

    CFRelease(path);

    [self.imageview.layer addAnimation:keyframeanimation forKey:nil];

     /*

     在帧动画内部属性,path的优先级要高于values的优先级

     */

 

3>CATransition

        //实现转场动画 **CATransition**

        CATransition *animation = [CATransition animation];

        //CATransition有两个常用属性,一个是type,另一个是subtype,表示转场动画的样式。

        /*

         `fromLeft', `fromRight', `fromTop' and

         * `fromBottom'

         */

        animation.type = @"fromLeft";

        

        //添加到控件图层

        [self.imageview.layer addAnimation:animation forKey:nil];

 4>CAAnimationGroup

 //创建组动画

    CAAnimationGroup *group = [CAAnimationGroup animation];

    //创建基本动画对象,实现平移效果

    CABasicAnimation *basic = [CABasicAnimation animation];

        //属性

    basic.keyPath = @"position";

    basic.byValue = [NSValue valueWithCGPoint:CGPointMake(100, 100)];

    

    //创建基本动画对象,实现旋转效果

    CABasicAnimation *basic2 = [CABasicAnimation animation];

    

    //属性

    basic2.keyPath = @"transform.rotation";

    //rotation属性如果不指定绕哪个轴,可以直接设置角度,默认是z轴。

    //scale属性不指定具体的轴的话,默认是都放大或者缩小

    basic2.byValue = @(M_PI_2);

    

    //创建基本动画,实现放大缩小效果

    CABasicAnimation *basic3 = [CABasicAnimation animation];

    

    //属性

    basic3.keyPath = @"transform.scale";

    basic3.byValue = @1.5;

    

    //添加到组动画

    group.animations = @[basic,basic2,basic3];

    

    //组动画属性

    group.duration = 3;

    group.removedOnCompletion = NO;

    group.fillMode = kCAFillModeForwards;

    

    //将组动画添加到图层

    [self.imageniew.layer addAnimation:group forKey:nil];

 

以上有错误的地方还请大神们多多指教。谢谢

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!