YOU'VE MADE A BRAVE DECISION, WELCOME.

每一个不曾起舞的日子都是对生命的辜负。

对Core Animation的了解

绘图

Core Animation


  • Core Animation的app拥有三个图层对象集合
    • 模型图层型
      • 存储所有动画的目标值
    • 呈现树
      • 包含所有运行中的动画的瞬时值
    • 渲染树
      • 执行实际的动画,并且是不公开的
  • CAEmitterLayer
    • 基于Core Animation的粒子发射器
    • 发射器层的对象控制粒子的生成和起源
  • CAGradientLayer
    • 绘制颜色渐变填充图层的形状
  • CAEAGLLayer / CAOpenLayer
    • 用于设置需要使用OpenGL ES绘制的内容
  • CAShapeLayer
    • 用于绘制三次贝塞尔曲线
  • CATextLayer
    • 用于绘制无格式的文本
  • CATransformLayer
    • 用于渲染一个真3D的图层
  • 如果你的代理实现了displayLayer:方法,实现方法负责创建位图并赋值给contents属性。(CG需要自建上下文再绘制,UIKit直接绘制)
  • drawLayer:inContext:方法,Core Animation创建一个位图,创建一个用于绘制位图的上下文,并调用代理方法填充该位图
  • 使用CATransaction类提供的方法创建与管理事务。通过调用begin类方法,可以开始(或隐式地创建)一个新的事务;调用commit类方法可结束一个事务

CABasicAnimation


  • 常用属性

    • repeatCount 重复的次数,不停重复设置为HUGE_VALF

    • repeatDuration 设置动画的时间,该时间内动画一直执行,不计次数

    • beginTime 设定动画开始的时间。如果开始延迟几秒的话,设置为[CACurrentMediaTime() + 几秒]

    • timingFunction 设置动画的速度变化

      • 1
        2
        3
        4
        5
        6
        7
        8
        9
        kCAMediaTimingFunctionLinear
        传这个值,在整个动画时间内动画都是以一个相同的速度来改变。也就是匀速运动。
        kCAMediaTimingFunctionEaseIn
        使用该值,动画开始时会较慢,之后动画会加速。
        kCAMediaTimingFunctionEaseOut
        使用该值,动画在开始时会较快,之后动画速度减慢。
        kCAMediaTimingFunctionEaseInEaseOut
        使用该值,动画在开始和结束时速度较慢,中间时间段内速度较快。
        kCAMediaTimingFunctionDefault
    • autoreverse 动画结束时是否执行逆动画

    • fromValue 所改变属性的起始值

    • toValue 所改变属性的结束时的值

    • byValue 所改变属性相同起始值的改变量

    • removedOnCompletion 防止动画结束后回到初始状态 所以为了使动画结束之后layer保持结束状态,应将removedOnCompletion设置为NO

    • fillMode 防止动画结束后回到初始状态 该属性定义了你的动画在开始和结束时的动作。默认值是 kCAFillModeRemoved。

      • 1
        kCAFillModeForwards 设置为该值,动画结束之后layer的状态将保持在动画的最后一帧,而removedOnCompletion的默认属性值是 YES,所以为了使动画结束之后layer保持结束状态,应将removedOnCompletion设置为NO。
      • 1
        kCAFillModeBackwards 设置为该值,将会立即执行动画的第一帧,不论是否设置了 beginTime属性。观察发现,设置该值,刚开始视图不见,还不知道应用在哪里。
      • 1
        kCAFillModeBoth 该值是 kCAFillModeForwards 和 kCAFillModeBackwards的组合状态
      • 1
        kCAFillModeRemoved 设置为该值,动画将在设置的 beginTime 开始执行(如没有设置beginTime属性,则动画立即执行),动画执行完成后将会layer的改变恢复原状。
    • speed 改变动画的速度 可以直接设置动画上的speed属性,这样只有这个动画速度。

      • 如果设置动画时间为4s,speed设置为2,则动画只需2s即可执行完。
      • 如果同时设置了动画的speed和layer 的speed,则实际的speed为两者相乘。
    • animationWithKeyPath:(NSString *)key中的key:

      • transform.rotation.x: 延X轴坐标旋转 类型:CGFloat或float * M_PI
      • transform.rotation.y: 延Y轴坐标旋转 类型:CGFloat或float * M_PI
      • transform.rotation.z: 延Z轴坐标旋转 类型:CGFloat或float * M_PI
      • transform.rotation: 这个与rotation.z是相同的 类型:CGFloat或float * M_PI
      • transform.scale: 整个layer的比例 类型:CGFloat
      • transform.scale.x: x轴坐标比例变化 类型:CGFloat
      • opacity: 透明度,闪烁等动画用 类型:CGColor
      • transform.translation.y:纵向移动 类型:CGMutablePathRef 可自定义
      • transform.translation.x:横向移动 类型:CGMutablePathRef 可自定义

CAKeyfarmeAnimation


  • 关键帧动画表现图层属性的变化
  • position是动画跟随一个路径。使用一个CGPathRef数据类型指定的
  • calculationMode属性定义了计算动画定时的算法
    • calculationMode属性被设置为kCAAnimationLinearCAAnimationCubic,线性和曲线
    • calculationMode属性被设置为kCAAnimationPacedkCAAnimationCubicPaced,节奏动画
    • calculationMode属性被设置为kCAAnimationDiscrete,离散动画
    • keyTimes属性为应用在每一关键帧指定应用到每一个关键帧上的计时器,不用于节奏动画
  • 调用图层的removeAnimationForKey:方法移除你的动画对象,指定的键值不为空

CALayer


  • position
    • 用于设置CALayer在父层的那个位置
    • 是基于anchorpoint
    • 以父层的左上角为圆点(0, 0)
  • anchorpoint
    • 决定CALayer上的某个点会在position属性所指的位置
    • 以自己左上角为圆点(0, 0)
    • x, y取值范围为[0,1];
  • 隐式动画
    • 一个UIView内部关联着一个CALayer,我们称这个Layer为Root Layer
    • 其它手动创建的CALayer都关联着一个隐式动画
    • 对非Root Layer的部分属性进行修改,默认会自动产生一些动画效果
      • bounds: 用于设置CALayer的宽高。修改会产生缩放的动画
      • Background: 用于设置CALayer的背景色。修改会产生背景色渐变动画
      • position:设置CALayer的位置。修改会产生平移的效果
    • 判断CALayer的某个属性是否支持隐式动画
      • 直接查看这个属性源文件,看是否有Animatable。
  • layer层绘图会减小消耗,因为它是操作缓存下来的绘图,而view层绘图是调用drawRect方法,但它整个操作是在主线程上,所以比较消耗CPU资源`