CALayer动画

  Core Animation是一个复合引擎,它的职责就是尽可能快地组合屏幕上不同的可视内容,这个内容是被分解成独立的图层,存储在一个叫做图层树的体系之中。而我们常使用的UIView中都包括一个background layer。在iOS中有4种层级树:视图树、图层树、呈现树、渲染树。那么我们来对比下UIView和CALayer在什么情况下适用。

UIView CALayer

阴影,圆角,带颜色的边框


响应链


3D变换


自动布局


非矩形范围

 

透明遮罩

 

多级非线性动画

 

一、CALayer属性

  下面列举出几个CALayer常用的属性

  contents:layer的寄宿对象,CGImage类型

  contentsGravity:对象的填充模式,和UIView中的fillMode一个作用

  contentsScale:适配高分辨率的缩放因子

  masksToBounds: 是否以bounds进行剪切

  contentsRect:显示图片中的rect区域。这个属性常用于“拼合”的技术中,将很多的小的图片集合在一张大的图片中,然后应用根据rect来显示

  contentsCenter:图片的缩放区域。这样我们可以提供一个小图,而指定小图中不变的区域,其它区域根据情况进行缩放

  这些属性中,我们现在很少使用到contentsRect以及contentsCenter,然后不得不说这两种属性是很有用的,可以一定程度的减少软件的大小

二、图层位置

  我们在设置图层位置的时候经常设置frame,但最好的方式是设置bounds和position。而在位置中还有一个参数anchorPoint,锚点。锚点你可以理解为图层旋转的时候参考点。这里有个公式对于这三个参数的描述:

  frame.origin.x = position.x - anchorPoint.x * bounds.size.width

  frame.origin.y = position.y - anchorPoint.y * bounds.size.height

  层做变换的时候,比如旋转或者缩放frame的size可能和bounds的size不一致。

  我们看到设置anchorPoint中的点点位置不展示的不同。

三、变换

  在iOS中有两种变换:

  CGAffineTransform:二维的变换,包括transform,scale,rotation.UIView的transform就是这种,所以不能做3D

  CATransform3D:三维的变换,包括transform,scale,rotation. 这里注意定义了m34才能拥有斜切的视觉。m34模拟了摄像机到物体的距离。

  有两个属性需要注意

  m34:在斜切的视觉中需要设置这个值,这个值用来模拟摄像机到物体的距离,越远则物体越有斜切的感觉。

  灭点:这个点位置为anchorPoint,这个点是用来说明我们视觉最远处交汇的点,像我们看物体越来越远,最终物体交汇到了一点

四、隐式动画

  我们在设置background,position等的时候,并没有设置动画,但是其却实现了动画。这就是隐式动画,隐式动画中有些参数用来指定属性

begin,commit,setAnimationDuration,setDisableActions,setCompletionBlock等,比如制定了动画的过渡时间,动画完成后执行的操作等。当然我们是可以指定默认的动画是什么的

  动画选择过程:

  1. 图层首先检测它是否有委托,并且是否实现CALayerDelegate协议指定的-actionForLayer:forKey方法。如果有,直接调用并返回结果
  2. 如果没有委托,或者委托没有实现-actionForLayer:forKey方法,图层接着检查包含属性名称对应行为映射的actions字典。
  3. 如果actions字典没有包含对应的属性,那么图层接着在它的style字典接着搜索属性名。
  4. 最后,如果在style里面也找不到对应的行为,那么图层将会直接调用定义了每个属性的标准行为的-defaultActionForKey:方法。

五、显示动画

  显示动画我们使用了很多,一般可以分为属性动画、过渡动画、自定义动画

  属性动画:CATransaction,CABasicAnimation,CAKeyFrameAnimation,CAAnimationGroup

  过渡动画:

  CATransition.过渡动画一般用于属性动画难以实现的效果,譬如交换两个UIView的层级关系等等

  [UIView transitionFromView: toView: duration: options: completion:]这个过渡动画相较于上面的过渡动画提供了其它的动画效果

  自定义动画:自定义动画的实现一般通过renderInContext获取截屏然后将这个图片加入视图中并对其作动画

六、图层时间

  每个图层都有属性来描述动画的相关属性:

  beginTime:动画开始的延长,指定了设置动画后过多久其执行

  speed:动画的执行速度

  timeOffset:动画直接跳到相应时间点的位置

  这里我们有个很有趣的动画效果,我们可以通过设置speed为0,然后通过timeOffset来实现一帧一帧变化的动画。

  

七、缓冲

  所谓的缓冲就是指动画执行过程中的来回反弹类似弹簧的效果,或者说由快到慢,由慢到快到动态。常用的缓冲方式由以下几种

  CAMediaTimingFunction:系统提供的时间缓冲函数,功能有限只提供了三次的贝塞尔曲线

  CAKeyFrameAnimation:关键帧动画,通过不断的设定关键帧的values,keyTimes,timingFunctions来模拟更复杂的时间缓冲函数、

  插值方式:我们把动画分割成更小的几部分,那么我们就可以用直线来拼接这些曲线。这里其实把所有的关键帧的计算都归结为一个对时间的差值运算。而这个插值运算的函数的推导并不简单。

八、CAShapeLayer

  功能:用于绘制不规则的图层。结合paintCode工具使用

  主要参数:path,strokeStart,strokerEnd

  常见使用场景:不规则图层、用于图层的不规则遮罩、进度条

九、CAGradientLayer

  功能:用于绘制具有渐变效果的图层

  主要参数:startPoint、endPoint、locations、colors

  常见使用场景:渐变遮罩,渐变色彩

十、CAReplicatorLayer

  功能:用于将子图层进行动态复制呈现。他能够将子图层的动画等完美复制,并且本身提供了呈现形式的控制参数

  主要参数:instanceCount、instanceTransform、instanceDelay、instanceColor

  常见使用场景:需要不断重复出现的场合:音频轨道,映射

十一、CAEmitterLayer

  功能:用于实现粒子效果

  主要参数:emitterShape、emitterSize、contents、emitterCells、……

  常见使用场景:抛洒效果,雨雪效果

十二、CATransformLayer

  功能:用于表现3D的层次。因为CALayer总是讲最后的呈现效果扁平化

  主要参数:同CALayer一样

  常见使用场景:展现z轴方向上的层次

==================

上面所示例的链接:share.zip

时间: 2024-10-25 09:42:27

CALayer动画的相关文章

GIF动画,菊花动画,UIView动画,CoreAnimation动画(CALayer动画)的用法

1.GIF动画 1 // 创建一个显示图片的imageView // viewController创建 2 UIImageView *showGifImageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 414, 736)]; 3 [self.view addSubview:showGifImageView]; 4 5 6 //创建一个存储图片的数组 7 NSMutableArray *saveImageViewArray

iOS动画:UIView动画和CALayer动画(CABasicAnimation、CAKeyframeAnimation的使用)

iOS中的动画有两种实现方式,一种是UIView来实现动画,另一种动画是通过CALayer来实现,下面介绍两种动画的简单实现: 一.UIView动画的实现 UIView使用Context来实现动画 关键代码: //参数1 动画名称 参数2 要实现动画的对象上下文          [UIView beginAnimations:@"attribute" context:_showImageView];          //设置动画的时间     [UIView setAnimatio

CoreAnimation (CALayer 动画)

CoreAnimation基本介绍: CoreAnimation动画位于iOS框架的Media层 CoreAnimation动画实现需要添加QuartzCore.Framework CoreAnimation基本上是LayerAnimation CoreAnimation分类: CoreAnimation作用: CoreAnimation CALayer基本介绍 CALayer的常用属性 CABasicAnimation CAKeyframeAnimation CAAnimationGroup

CALayer动画的暂停,恢复,以及结束时候的回调

源码如下: // // ViewController.m // AnimationLineView // // Created by YouXianMing on 14/11/7. // Copyright (c) 2014年 YouXianMing. All rights reserved. // #import "ViewController.h" #import "YXGCD.h" @interface ViewController () @end @impl

实现UIView的无限旋转动画(非CALayer动画)

效果: 素材: 源码: // // ViewController.m // Animation // // Created by YouXianMing on 15/2/5. // Copyright (c) 2015年 YouXianMing. All rights reserved. // #import "ViewController.h" @interface ViewController () @property (nonatomic, strong) UIImageView

CALayer动画---使用CAShapeLayer制作类似微信小视频按钮动画

废话少说,直接上代码.工程截图如下图所示.由于对程序进行了封装,所以在主控制器中,只需要给出该customview的frame即可,显示图形的半径等于给出frame的宽度的一半. 例如: CustomView *customView = [[CustomView alloc]initWithFrame:CGRectMake(0, 0, 100, 100)]; 也就是在位置为(0, 0)处创建出一个半径为100/2=50的view. 图1   工程截图 1 CustomView.m文件中实现的代码

CALayer的使用

CALayer简介 1.CALayer一般作为UIView的容器而使用 2.CALayer是一个管理着图片载体(image-based content)的层结构 3.直接修改单独创建出的CALayer的属性可以出发隐式动画 4.UIView中的CALayer动画必须显示出发才能生效 CALayer实现自定义进度条 - (void)viewDidLoad { [super viewDidLoad]; UIView *containerView = [[UIView alloc] initWithF

iOS动画浅汇

转自:http://www.cocoachina.com/ios/20160311/15660.html 在iOS开发中,制作动画效果是最让开发者享受的环节之一.一个设计严谨.精细的动画效果能给用户耳目一新的效果,吸引他们的眼光 —— 这对于app而言是非常重要的.我们总是追求更为酷炫的实现,如果足够仔细,我们不难发现一个好的动画通过步骤分解后本质上不过是一个个简单的动画实现.本文就个人搜集的一些动画相关的理论和实践知识做个小结,不足之处请勿见怪. 理论 UIview VS UIlayer UI

iOS动画浅汇(转)

转自:http://www.cocoachina.com/ios/20160311/15660.html 在iOS开发中,制作动画效果是最让开发者享受的环节之一.一个设计严谨.精细的动画效果能给用户耳目一新的效果,吸引他们的眼光 —— 这对于app而言是非常重要的.我们总是追求更为酷炫的实现,如果足够仔细,我们不难发现一个好的动画通过步骤分解后本质上不过是一个个简单的动画实现.本文就个人搜集的一些动画相关的理论和实践知识做个小结,不足之处请勿见怪. 理论 UIview VS UIlayer UI