动画:Core Animation

作者: sea777777 | 来源:发表于2016-06-14 11:14 被阅读65次

    UIView 可实现一般动画,如果更复杂动画,需要用core animation

    core animation基于openGL 和 core graphics。

    Core Animation是一套包含图形绘制、投影、动画的Objective-C类集合,该框架包含在QuartzCore.framework中,它因为被用于处理更为强大的平滑的转场效果而引入OS X Leopard和iOS而出名。

    QuartzCore /Quartz 2D  基于core graphics;

    CALayer

    Layer Classes是core animation的基础。Layer Classes提供了一个抽象的概念,这个概念对于那些使用NSview和UIview的开发者来说是很熟悉的。基础层是由CAlayer类提供的,CAlayer是所有Core Animation层的父类。

    同一个视图类的实例一样,一个CAlayer实例也有一个单独的superlayer和上面所有的子层(sublayers),它创建了一个有层次结构的层,我们称之为layer tree。layers的绘制就像views一样是从后向前绘制的,绘制的时候我们要指定其相对与他们的superlayer的集合形状,同时还需要创建一个局部的坐标系。layers可以做一些更复杂的操作,例如rotate(旋转),skew(倾斜),scale(放缩),和project the layer content(层的投影)。

    巴拉巴拉那么多,其实CALayer是个简单的类,它是用来在屏幕上显示内容展示的矩形区域。那么和UIView区别是什么?

    1.每个UIView 都有 CALayer,即 UIView.layer或者[UIView layer] ,这个layer叫做root layer。

    2.UIView可以响应事件,而CALayer只负责显示。(UIView是有delegate的CALayer)

    3.CALayer 有两个属性,position(相对于父类的位置)、anchorPoint(锚点,x范围0~1,y范围0~1,决定图层身上的哪个点会在position所指的位置),锚点在旋转的时候作为支点;

    注:frame:(x,y,with,height)  = bounds(x,y,width,height) + position(x,y)+锚点

    CAAnimation

    CAAnimation分为这4种,他们分别是

    1.CABasicAnimation

    通过设定起始点,终点,时间,动画会沿着你这设定点进行移动。

    2.CAKeyframeAnimation

    Keyframe顾名思义就是关键点的frame,你可以通过设定CALayer的始点、中间关键点、终点的frame,时间,动画会沿你设定的轨迹进行移动,也就是说它可以把一个baseAnimation分成多个点和多个时间段来执行;

    3.CAAnimationGroup

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

    4.CATransition

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

    (1)values属性

    values属性指明整个动画过程中的关键帧点,例如上例中的A-E就是通过values指定的。需要注意的是,起点必须作为values的第一个值。

    (2)path属性

    作用与values属性一样,同样是用于指定整个动画所经过的路径的。需要注意的是,values与path是互斥的,当values与path同时指定时,path会覆盖values,即values属性将被忽略。

    animationWithKeyPath

    kCAMediaTimingFunctionLinear//线性

    kCAMediaTimingFunctionEaseIn//淡入

    kCAMediaTimingFunctionEaseOut//淡出

    kCAMediaTimingFunctionEaseInEaseOut//淡入淡出

    kCAMediaTimingFunctionDefault//默认

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

    kCAAnimationLinear//线性,默认

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

    kCAAnimationPaced//平均,keyTimes跟timeFunctions失效

    kCAAnimationCubic//平均,同上

    kCAAnimationCubicPaced//平均,同上

    //缩放

    CABasicAnimation*animation = [CABasicAnimationanimationWithKeyPath:@"transform.scale"];

    animation.duration=5;

    animation.fromValue= [NSNumbernumberWithFloat:1.0];

    animation.toValue= [NSNumbernumberWithFloat:0.2];

    animation.autoreverses=YES;

    animation.repeatCount=MAXFLOAT;

    //沿贝塞尔路径的动画,另外一种实现:用CAShapeLayer设置path

    UIBezierPath*path = [UIBezierPathbezierPathWithArcCenter:CGPointMake(100,100)radius:100startAngle:-M_PI_2endAngle:M_PI*2clockwise:YES];

    CAKeyframeAnimation*animation2 = [CAKeyframeAnimationanimationWithKeyPath:@"position"];

    animation2.path= path.CGPath;

    animation2.rotationMode=kCAAnimationRotateAuto;

    //动画组

    CAAnimationGroup*group = [CAAnimationGroupanimation];

    group.animations= [NSArrayarrayWithObjects:animation,animation2,nil];

    group.duration=5;

    group.repeatCount=MAXFLOAT;

    [view.layeraddAnimation:groupforKey:@"group"];

    相关文章

      网友评论

        本文标题:动画:Core Animation

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