iOS 动画浅析

借一张图说事,iOS 动画常用的有两种,一种是基于UIKit方式去设计动画,一种是基于Core Animation的方式去设计动画。基于UIKit的动画主要是UIView的一些动画,基于block的一些动画;基于Core Animation的动画是对layer层设计的一些动画。从上图可以看出来,Core Animation更接近底层,Core Graphic和OpenGL ES主要负责绘制功能。

CALayer核心动画与UIView动画(基于UIKit的动画)的区别:UIView封装的动画是实际操作的是控件的layer层和逻辑层,而Core Animation作用于控件的layer层,这使得layer层即使发生变化,逻辑层是不变的。

关于Core Animation:

1)CAAnimation可分为四种:

1.CABasicAnimation

通过设定起始点,终点,时间,动画会沿着你这设定点进行移动。可以看做特殊的

CAKeyFrameAnimation

2.CAKeyframeAnimation

Keyframe顾名思义就是关键点的frame,你可以通过设定CALayer的始点、中间关键点、终点的frame,时间,动画会沿你设定的轨迹进行移动

3.CAAnimationGroup

Group也就是组合的意思,就是把对这个Layer的所有动画都组合起来。PS:一个layer设定了很多动画,他们都会同时执行,如何按顺序执行我到时候再讲。

4.CATransition

这个就是苹果帮开发者封装好的一些动画

动画的过程如下:

演员--->CALayer,规定电影的主角是谁

剧本--->CAAnimation,规定电影该怎么演,怎么走,怎么变换

开拍—>AddAnimation,开始执行

2)一些参数的设置

1.autoreverses    动画到达目标位置后,不复原重新开始,而是反向开始走回去

2.animationWithKeyPath的值:


  transform.scale = 比例轉換


    transform.scale.x = 闊的比例轉換


    transform.scale.y = 高的比例轉換


    transform.rotation.z = 平面圖的旋轉


    opacity = 透明度


    margin


    zPosition


    backgroundColor    背景颜色


    cornerRadius    圆角


    borderWidth


    bounds


    contents


    contentsRect


    cornerRadius


    frame


    hidden


    mask


    masksToBounds


    opacity


    position


    shadowColor


    shadowOffset


    shadowOpacity


    shadowRadius

3)fileModel

fillMode的作用就是决定当前对象过了非active时间段的行为. 比如动画开始之前,动画结束之后。如果是一个动画CAAnimation,则需要将其removedOnCompletion设置为NO,要不然fillMode不起作用. 下面来讲各个fillMode的意义 
kCAFillModeRemoved 这个是默认值,也就是说当动画开始前和动画结束后,动画对layer都没有影响,动画结束后,layer会恢复到之前的状态 
kCAFillModeForwards 当动画结束后,layer会一直保持着动画最后的状态 
kCAFillModeBackwards 这个和kCAFillModeForwards是相对的,就是在动画开始前,你只要将动画加入了一个layer,layer便立即进入动画的初始状态并等待动画开始.你可以这样设定测试代码,将一个动画加入一个layer的时候延迟5秒执行.然后就会发现在动画没有开始的时候,只要动画被加入了layer,layer便处于动画初始状态 
kCAFillModeBoth 理解了上面两个,这个就很好理解了,这个其实就是上面两个的合成.动画加入后开始之前,layer便处于动画初始状态,动画结束后layer保持动画最后的状态.

-(void)pauseLayer:(CALayer*)layer
{
    CFTimeInterval pausedTime = [layer convertTime:CACurrentMediaTime() fromLayer:nil];
    layer.speed = 0.0;
    layer.timeOffset = pausedTime;
}

-(void)resumeLayer:(CALayer*)layer
{
    CFTimeInterval pausedTime = [layer timeOffset];
    layer.speed = 1.0;
    layer.timeOffset = 0.0;
    layer.beginTime = 0.0;
    CFTimeInterval timeSincePause = [layer convertTime:CACurrentMediaTime() fromLayer:nil] - pausedTime;
    layer.beginTime = timeSincePause;
}
4) timeFunctions属性

用过UIKit层动画的同学应该对这个属性不陌生,这个属性用以指定时间函数,类似于运动的加速度,有以下几种类型。上例子的AB段就是用了淡入淡出效果。记住,这是一个数组,你有几个子路径就应该传入几个元素

1 kCAMediaTimingFunctionLinear//线性

2 kCAMediaTimingFunctionEaseIn//淡入

3 kCAMediaTimingFunctionEaseOut//淡出

4 kCAMediaTimingFunctionEaseInEaseOut//淡入淡出

5 kCAMediaTimingFunctionDefault//默认

5)calculationMode属性

该属性决定了物体在每个子路径下是跳着走还是匀速走,跟timeFunctions属性有点类似

1 const kCAAnimationLinear//线性,默认

2 const kCAAnimationDiscrete//离散,无中间过程,但keyTimes设置的时间依旧生效,物体跳跃地出现在各个关键帧上

3 const kCAAnimationPaced//平均,keyTimes跟timeFunctions失效

4 const kCAAnimationCubic//平均,同上

5 const kCAAnimationCubicPaced//平均,同上

6)作用与values属性一样,同样是用于指定整个动画所经过的路径的。需要注意的是,values与path是互斥的,当values与path同时指定时,path会覆盖values,即values属性将被忽略。例如上述例子等价于代码中values方式的path设置方式为:

1     CGMutablePathRef path = CGPathCreateMutable();

2     CGPathMoveToPoint(path, NULL, rectLayer.position.x - 15, rectLayer.position.y - 15);

3     CGPathAddLineToPoint(path, NULL, 320 - 15, rectLayer.frame.origin.y);

4     CGPathAddLineToPoint(path, NULL, 320 - 15, rectLayer.frame.origin.y + 100);

5     CGPathAddLineToPoint(path, NULL, 15, rectLayer.frame.origin.y + 100);

6     CGPathAddLineToPoint(path, NULL, 15, rectLayer.frame.origin.y);

7     rectRunAnimation.path = path;

8     CGPathRelease(path);

这是写动画的另外一种方式,相对于关键帧动画。

7)values

这个是在关键帧动画中用来设置关键值的参数。需要注意的是,它设置的值是移动的中心值,uiview.layer的位置值得到的是图形左上坐标值,锚点默认是(0.5,0.5)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值