zoukankan      html  css  js  c++  java
  • CoreAnimation

    CoreAnimation备忘

    CoreAnimation是专门处理动画的,它可以实现强大炫目的动画功能,Core Animation的动画执行过程都是在后台操作的,不会阻塞主线程。需要注意的是Core Animation作用在CALayer上的,并不是UIView

     

    动画常用类/结构图

    CABasicAnimation -- 实例

            // 创建动画,keyPath是一个路径,代表动画将修改的属性
            let basicAnimation = CABasicAnimation(keyPath: "position")
            let fromPosition = layer?.position
            let toPositon = CGPointMake(200, 200)
            basicAnimation.fromValue = NSValue(CGPoint: fromPosition!)
            basicAnimation.toValue = NSValue(CGPoint: toPositon)
            basicAnimation.duration = 0.5
            basicAnimation.repeatCount = MAXFLOAT
            basicAnimation.removedOnCompletion = false
            basicAnimation.fillMode = kCAFillModeForwards
            basicAnimation.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseIn)
            basicAnimation.autoreverses = true
            basicAnimation.beginTime = CACurrentMediaTime() + 5
            
            // 创建动画后 添加到图层上
            layer?.addAnimation(basicAnimation, forKey: nil)    

     属性介绍:

    • fromValue:起点的值。
    • toValue:终点的值,这是一个绝对的值,意思是动画最终会到达这个值。
    • byValue:终点的值,这是一个相对的值,意思以起点为准增加多少值。
    • duration:动画时长。
    • repeatCount:重复次数,如果重复无数次使用 MAXFLOAT。
    • removedOnCompletion:动画结束后,是否删除动画。
    • fillMode:填充模式,当赋值kCAFillModeForwards 并且 removedOnCompletion为false时,动画执行完毕后不会回到初始状态。
    • timingFunction:动画的速度变化,比如:先快后慢,或先慢后快。
    • beginTime:动画开始时间。
    • autoreverses:是否执行逆动画

    初始化方法的keypath设置:

    • let basicAnimation = CABasicAnimation(keyPath: "position"):位移动画
    • let basicAnimation = CABasicAnimation(keyPath: "transform.rotation.z"):旋转动画,x,y,z三个轴都可以
    • let basicAnimation = CABasicAnimation(keyPath: "transform.scale"):缩放动画
    • let basicAnimation = CABasicAnimation(keyPath: "alpha"):透明动画

    这些只是常用的,更多属性进入父类查看。

    CAAnimationGroup -- 实例

            // 创建位移动画
            let animation1 = CABasicAnimation(keyPath: "position")
            animation1.byValue = NSValue(CGPoint: CGPointMake(100, 100))
            
            // 创建旋转动画
            let animation2 = CABasicAnimation(keyPath: "transform.rotation.z")
            animation2.toValue = NSNumber(double: M_PI * 2)
            
            // 创建动画组
            let group = CAAnimationGroup()
            // 设置一些属性
            group.duration = 2.0
            group.autoreverses = true
            group.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseIn)
            group.animations = [animation1, animation2]
            group.repeatCount = MAXFLOAT
            
            // 添加动画组
            layer?.addAnimation(group, forKey: nil)
    

     注意:动画组中的动画是一起执行的。

    顺序动画的执行:

        // 1、懒加载 只执行一次,并设置动画代理
        lazy var animations: [CAAnimation] = {
            // 创建位移动画
            let animation1 = CABasicAnimation(keyPath: "position")
            animation1.byValue = NSValue(CGPoint: CGPointMake(100, 100))
            animation1.duration = 1.0
            animation1.removedOnCompletion = false
            animation1.fillMode = kCAFillModeForwards
            animation1.delegate = self
            
            // 创建旋转动画
            let animation2 = CABasicAnimation(keyPath: "transform.rotation.z")
            animation2.toValue = NSNumber(double: M_PI * 2)
            animation2.duration = 1.0
            animation2.removedOnCompletion = false
            animation2.fillMode = kCAFillModeForwards
            animation2.delegate = self
    
            var array = [animation1, animation2]
            return array
        }()
    
        // 2、添加第一个动画
        layer?.addAnimation(animations[0], forKey: nil)
    
        // 3、实现代理方法
        // MARK: 动画代理
        override func animationDidStart(anim: CAAnimation) {
            animations.removeFirst()
        }
        
        override func animationDidStop(anim: CAAnimation, finished flag: Bool) {
            guard let animation = animations.first else { return }
            layer?.addAnimation(animation, forKey: nil)
        }
    

     

     CAKeyframeAnimation -- 实例

    CAKeyframeAnimation-关键帧动画,它有两个重要的属性(二选一):

    • path:CGPathRef对象,默认为nil,顾名思义 当设置path时、动画会按照这个路径执行动画,当设置了values时 这个属性就会被覆盖。
    • values:一个数组,提供关键帧的值(一组),当设置path时 不必设置设个属性。
            // 使用path
            let keyframe = CAKeyframeAnimation(keyPath: "position")
            // 创建路径
            let path = CGPathCreateMutable()
            // 移动到原点
            CGPathMoveToPoint(path, nil, 50, 100)
            // 添加直线路径
            CGPathAddLineToPoint(path, nil, 300, 80)
            CGPathAddLineToPoint(path, nil, 150, 250)
            // 添加曲线
            CGPathAddCurveToPoint(path, nil, 49.0, 200, -100, 0, 150, 150)
            
            keyframe.path = path
            keyframe.duration = 3.0
            
            layer?.addAnimation(keyframe, forKey: nil)
    
            /* ----------------------------分割线---------------------------- */
    
            // 使用values
            let keyframe = CAKeyframeAnimation(keyPath: "position")
            // 创建point
            let p1 = layer?.position
            let p2 = CGPointMake(50, 50)
            let p3 = CGPointMake(100, 300)
            let p4 = CGPointMake(150, 150)
            
            // 转换成NSValue
            let v1 = NSValue(CGPoint: p1!)
            let v2 = NSValue(CGPoint: p2)
            let v3 = NSValue(CGPoint: p3)
            let v4 = NSValue(CGPoint: p4)
            
            let values = [v1, v2, v3, v4]
            keyframe.values = values
            keyframe.duration = 4.0
            
            layer?.addAnimation(keyframe, forKey: nil)
    

     控制每一帧的时间:

    算法:总时间 / (总帧数 - 1),也就是说如果指定了3帧、10秒的总时间,10 / (3 - 1) = 5

            // 使用values
            let keyframe = CAKeyframeAnimation(keyPath: "position")
            // 创建point
            let p1 = layer?.position
            let p2 = CGPointMake(50, 50)
            let p3 = CGPointMake(100, 300)
            let p4 = CGPointMake(150, 150)
            
            // 转换成NSValue
            let v1 = NSValue(CGPoint: p1!)
            let v2 = NSValue(CGPoint: p2)
            let v3 = NSValue(CGPoint: p3)
            let v4 = NSValue(CGPoint: p4)
            
            let values = [v1, v2, v3, v4]
            keyframe.values = values
            keyframe.duration = 4.0
            // 取值在0 ~ 1.0之间
            keyframe.keyTimes = [NSNumber(double: 0.0), NSNumber(double: 0.8), NSNumber(double: 1.0), NSNumber(double: 0.2)]
            // 每一帧的计算模式
            keyframe.calculationMode = kCAAnimationLinear
            
            layer?.addAnimation(keyframe, forKey: nil)
    

    CATransition -- 实例

            let transition = CATransition()
            transition.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseIn)
            transition.duration = 0.5
            transition.removedOnCompletion = false
            transition.fillMode = kCAFillModeForwards
            // 过渡类型
            transition.type = kCATransitionReveal
            // 过渡方向
            transition.subtype = kCATransitionFromTop
            
            layer?.addAnimation(transition, forKey: nil)
            layer?.backgroundColor = UIColor.blackColor().CGColor
    

     过渡类型(type):

    • kCATransitionFade:交叉淡化过渡 
    • kCATransitionMoveIn:新视图移到旧视图上面 
    • kCATransitionPush:新视图把旧视图推出去 
    • kCATransitionReveal:将旧视图移开,显示下面的新视图
    • "pageCurl":向上翻一页 
    • "pageUnCurl":向下翻一页 
    • "rippleEffect":滴水效果 
    • "suckEffect":收缩效果,如一块布被抽走 
    • "cube":立方体效果
    • "oglFlip":上下翻转效果

    过渡方向(subType):

    • kCATransitionFromLeft:由左向右(默认)
    • kCATransitionFromRight:由右向左
    • kCATransitionFromTop:由下向上
    • kCATransitionFromBottom:由上向下
  • 相关阅读:
    poj 3348 Cows 凸包 求多边形面积 计算几何 难度:0 Source:CCC207
    uva 12356 Army Buddies 树状数组解法 树状数组求加和恰为k的最小项号 难度:1
    cf 290F. Treeland Tour 最长上升子序列 + 树的回溯 难度:1
    poj 2739 Sum of Consecutive Prime Numbers 素数 读题 难度:0
    poj 1379 Run Away 模拟退火 难度:1
    模拟退火算法
    快速切题 sgu 112. a^b-b^a 大数 次方 难度:0 非java:1
    快速切题 poj 1003 hangover 数学观察 难度:0
    #Leetcode# 404. Sum of Left Leaves
    PAT 甲级 1012 The Best Rank
  • 原文地址:https://www.cnblogs.com/Alex-sk/p/5561430.html
Copyright © 2011-2022 走看看