zoukankan      html  css  js  c++  java
  • 隐式动画和核心动画

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

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

  • 相关阅读:
    cmder
    navicat 查询保存的位置
    git使用
    怎么保证测试用例的覆盖率
    python3.7-初学篇-19-良好的习惯
    python基础篇-使用list和tuple
    python基础篇-字符串和编码
    python基础篇-输入和输出
    python3.7-初学篇-21
    python3.7-初学者-20
  • 原文地址:https://www.cnblogs.com/xiaofei993/p/5314905.html
Copyright © 2011-2022 走看看