iOS开发--Core Animation(核心动画)(一)

作者: coder_那一抹刚吹过的风 | 来源:发表于2016-07-16 09:49 被阅读296次

Core Animation is a graphics rendering and animation infrastructure available on both iOS and OS X that you use to animate the views and other visual elements of your app.(苹果官方文档.见参考链接)

从上面官方文档中我们可以知道,Core Animation一个图像渲染和动画的底层架构。我们主要是用它是我们app中的视图或者其他可见部分动起来。

今天狠下心,花了一天的时间好好拜读了一下苹果的核心动画说明文档,虽然英文读的我很痛苦,但是还是收获颇多。首先跟大家说一些理论性的东西,毕竟实现那一套东西已经被写烂了,实在写不出什么东西了。

* 1 Core Animation本身不是一套绘画系统

也就是它本身不能进行视图内容的绘画。但是它可以基于硬件对你视图的内容进行合成和操作。重要的事情着重说:

框架的核心是层对象(CALyer Objects)

说完上面的东西大家心里应该大致记住两件事,1.Core Animation本身不能进行绘画,至于他怎么实现动画,一会儿我会揭晓。2.Core Animation的核心是层对象。

* 2 CALyer的两套坐标系

首先声明一点,CALyer的在屏幕上显示的位置是这个两者相互重要的结果。

第一种坐标系 point-based coordinate systems ,这种坐标是我相信大家都非常熟悉,我们平常对于视图的定位都是用的它。

点坐标系.png

第二种坐标系unit coordinate systems单元坐标系,这个是我今天想要跟大家介绍的。苹果公司对于引入他的解释说的非常魔性,

Unit coordinates are used when the value should not be tied to screen coordinates because it is relative to some other value. For example, the layer’s anchorPoint property specifies a point relative to the bounds of the layer itself, which can change.

单位坐标地.png

大家如果实在不懂,可以使用翻译工具翻译一下看看。大意就是当这个值不和屏幕坐标绑定在一起,而是和其他的值有关,这个时候我们要用到单元坐标系。比如说层的锚点就是和层本身的界限有关,并且它是可改变的。OK,通过这句话我们要明白一点,也是大家经常犯迷糊的一点。重点我强调说:

修改单元坐标系的内容将会对点坐标系的设置产生影响。

怎么理解上面这句话那。举个例子,我们见一个起始点为(50, 50),大小为(100,100)的CALyer添加到视图的子层上,这个时候我们修改锚点为(0,0)(锚点默认(0.5, 0.5)),并且在此之后我们打印这个层的起始点,发现此时起始点的坐标会变成(100, 100)。

最后在强调一下

CALyer显示的位置点坐标系和单元坐标系两者设置共同的作用的结果。变化范围x,y方向上都是0~1。

强势插入一波 position和 anchorPoint

position默认是CALyer的中心点坐标,注意,并不是说position就是CALyer的中心点。当我创建CALyer时,他的值就确定了,当然我们也可以修改的他的值,用法类似于view的center。而锚点的使用来确定当前position在CALyer的位置。

锚点修改的之后position在当前CALyer的位置,即单元坐标系中的位置,对于他在坐标系的位置无关。

强势分析一波。再用上面的那个例子,当前层的中心点坐标为(100, 100), position的坐标也为(100, 100), 锚点为(0.5, 0.5)。然后我们修改锚点的为(0.0),也就是说我们将position放到CALyer的起始点位置。由上面的说明我们知道,此时position的点坐标位置不变还是为(100, 100),那么此时层的中心点坐标就成了(150, 150)。现在大家明白为什么修改锚点会改变CALyer的位置了吧。

* 3 CALyer与View的关系

CALyer View
能否创建可见图像 不能,必须依赖视图 能够直接创建
能否响应事件 不能
能否进行绘画 不能
除了展示图像的其他功能 很少 很多

通上表大家可以知道CALyer的局限性很大,为什么还需要他那?主要是因为他能是图像绘画和运动变得更加简单,方便和高效。当然,这个CALyer的底层实现是密不可分的。CALyer的实现比不是调用底层硬件对图像就行重绘,而是通过对图像对象对应的数字位图(一种图片格式)进行操作,在深入的作者我就不懂了。

* 4 动画的两种方式

设置动画主要分为两种,属性动画和关键帧动画。
属性动画:这个很好理解,相信大部分也都曾用到过.属性动画就是通过对当前层属性的修改,从而达到图像改变或运动的目的.至于可修改的属性以及怎样修改,我稍后会更新一片实战的,到时候大家可以用心感受一下.
关键帧动画:这个对于大家可能有点陌生.实力分析一波,我们将动画分成几个关键的帧,然后让他在一定时间的运行,以这样的方式实现的动画就是关键帧动画.
除了上述的两种动画以外,苹果公司还提供了大量的自定义动画,他们都是CALyer的子类,实现了莫一种特殊的动画.有兴趣的朋友可以研究一下.

* 5 设置CALyer的内容

1.直接用图片做为内容
因为层是一个管理位图的容器,所以可以直接将一个图片对象赋值给层的contents属性.
2.调用代理方法
这种可以动态的为CALyer添加内容,代理方法有两个
如果是调用的displayLayer方法,核心动画将会根据代码创建位图赋值给layer的contents属性.
如果调用drawLayer : inContext方法.那么核心动画会创建一个绘图上下文,我们可以将代码写在其中,然后调用这个代理,将图像写入位图中,然后默认调用displayLayer方法赋值给layer的contents属性.

或许还有很多理论性的东西我没有注意到,毕竟我只拜读一边.苹果的动画做的算是相当不错.如此优秀东西的介绍岂会被我一遍全部领会,我会抽时间再去拜读,如果有新领悟,我会更新这篇博文.

About Core Animation

相关文章

网友评论

    本文标题:iOS开发--Core Animation(核心动画)(一)

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