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

上一篇讲了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地址

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,029评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,238评论 3 388
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,576评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,214评论 1 287
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,324评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,392评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,416评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,196评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,631评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,919评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,090评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,767评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,410评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,090评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,328评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,952评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,979评论 2 351

推荐阅读更多精彩内容