从零到一学习CoreAnimation(2.帧动画)

作者: mkb2 | 来源:发表于2016-08-27 23:09 被阅读233次

    上一篇讲了CABasicAnimation,总结一下
    1.fromValue,toValue,因为是基本动画,所以只有这两个属性(好像只有CABasicAnimation才有)
    2.操作对象是layer
    3.要执行什么动画,通过keyPath指定
    4.继承自CAPropertyAnimation(CAKeyAnimation也继承这个)


    做动画基本步骤
    1.创建对象
    2.设置要执行什么动画
    3.设置动画的数值
    4.设置执行完动画不移除的属性
    5.添加动画

    今天讲解一下帧动画CAKeyframeAnimation,做动画有两种方法:

    1.通过values属性做动画
    通过一个数组装有4个点做动画
       //1.通过values执行动画组
        private func valuesForAnimation()
        {
              let anim = CAKeyframeAnimation()
            
            //0.做什么的动画
            anim.keyPath = "position"
            //1.点之间的移动
            let value1 = NSValue.init(CGPoint: CGPointZero)
            let value2 = NSValue.init(CGPoint: CGPointMake(14, 15))
            let value3 = NSValue.init(CGPoint: CGPointMake(141, 115))
            let value4 = NSValue.init(CGPoint: CGPointMake(404, 175))
            let value5 = NSValue.init(CGPoint: CGPointMake(55, 5))
            
            //3.设置属性
            anim.values = [value1,value2,value3,value4,value5]
            anim.duration = 2
            
            //4.防止动画被移除
            anim.removedOnCompletion = false
            anim.fillMode = kCAFillModeForwards
            
            
            //4,添加动画
            gView.layer .addAnimation(anim, forKey: nil)
        }
    
    2.通过path属性做动画
    通过path执行动画
       //2.通过path执行动画
        private func pathForAnimation(){
            //1.创建帧动画
            let anim = CAKeyframeAnimation()
            
            //2.做什么的动画
            anim.keyPath = "position"
            
            //3.创建路径,一定要释放
            let path = CGPathCreateMutable()
            CGPathAddEllipseInRect(path, nil, CGRectMake(100, 300, 156, 300))
            anim.path = path
            
            //防止动画消失的属性
            anim.removedOnCompletion = false
            anim.fillMode = kCAFillModeForwards
            //设置时间属性
            anim.duration = 2
            
            //添加动画
            gView.layer .addAnimation(anim, forKey: nil)
        }
    

    要根据path执行动画,首先应该有path,就创建一个,但是应当执行release操作,好像这个swift中没有,我找了,没找到,但是oc中必须执行CAPathRelease操作,否则有问题

    kCAMediaTimingFunctionEaseInEaseOut 慢进慢出

    说说动画对象的timingFunction属性,还是刚才的代码,只是多添加了一个属性的设置和介绍

        //2.通过path执行动画
        private func pathForAnimation(){
            //1.创建帧动画
            let anim = CAKeyframeAnimation()
            
            //2.做什么的动画
            anim.keyPath = "position"
            
            //3.创建路径,一定要释放
            let path = CGPathCreateMutable()
            CGPathAddEllipseInRect(path, nil, CGRectMake(100, 300, 156, 300))
            anim.path = path
            
            //防止动画消失的属性
            anim.removedOnCompletion = false
            anim.fillMode = kCAFillModeForwards
            anim.delegate = self
            
            
            //执行动画的节奏
            
            /**
             ease 是缓慢的意思
             
             平缓匀速
             public let kCAMediaTimingFunctionLinear: String
             
             缓慢进入,其余的都是匀速
             public let kCAMediaTimingFunctionEaseIn: String
             
             缓慢移除
             public let kCAMediaTimingFunctionEaseOut: String
             
             慢慢进入慢慢出去
             public let kCAMediaTimingFunctionEaseInEaseOut: String
             
             默认
             public let kCAMediaTimingFunctionDefault: String
             */
            anim.timingFunction = CAMediaTimingFunction.init(name: kCAMediaTimingFunctionEaseInEaseOut)
            
            
            //设置时间属性
            anim.duration = 2
            
            //添加动画
            gView.layer .addAnimation(anim, forKey: nil)
        }
    
    动画的代理方法

    1.不用声明什么代理就直接可以使用方法
    2.必须要成为代理才执行代理的方法

        //动画的代理方法,开始,结束
        override func animationDidStart(anim: CAAnimation) {
            print("开始")
        }
        override func animationDidStop(anim: CAAnimation, finished flag: Bool) {
            print("结束")
        }
    

    不解释了,不说也懂~

    总结
    1.帧动画操作的对象也是layer
    2.帧动画可以通过valuespath设置执行的路径
    3.可以监听动画的代理方法
    4.可以设置动画的进入和离开的动画模式
    5.CAKeyframeAnimationCABasicAnimation 都继承自 CAPropertyAnimation
    6.时间速度,代理CAAnimation的属性,所有的动画都有,都可以使用

    白送一个动画效果
    苹果自带软件删除的晃动效果
        @IBAction func start(sender: AnyObject) {
            let anim = CAKeyframeAnimation()
            
            //1.设置要执行啥动画
            anim.keyPath = "transform.rotation"
            //2.设置动画的数值
            anim.values = [-15/180*M_PI,15/180*M_PI,-15/180*M_PI]
            //3.设置其他属性
            anim.duration = 0.9
            anim.repeatCount = 100
            //4.设置动画结束后保存原样
            anim.removedOnCompletion = false
            anim.fillMode = kCAFillModeForwards
            
            gView.layer.addAnimation(anim, forKey: "shake")
        }
        
        
        @IBAction func stop(sender: AnyObject) {
            gView.layer.removeAnimationForKey("shake")
        }
    

    addAnimation(anim, forKey: "shake")中的forKey,就是给动画一个名字,删除的时候方便找到,然后删除

    demo地址

    相关文章

      网友评论

        本文标题:从零到一学习CoreAnimation(2.帧动画)

        本文链接:https://www.haomeiwen.com/subject/lgetettx.html