OS----Core Animation介绍1
2011-09-05 19:04:34| 分类: QuartzCore |字号 订阅
觉得ios中的
Core Animation还是很有用的,以前只是知道怎么用,但是没有系统的看过文档,所以决定把其文档好好的看一下,在此记录一下比较有用的东西,废话不多了,现在开始。
layer 的坐标系统在ios中是从左上角开始,向两个方向扩展。跟view的坐标系统一样。每一个layer对象定义和维护自己的坐标系统。因为每一个layer 定义了自己的坐标系统,所以CALayer对象提供了一些方法用于从一个坐标系统的点,矩形,size转换到另一个坐标系统。
一些layer的属性用单位坐标空间衡量其值。单位坐标空间的值相对于layer的bounds。一个单位空间的值的范围一般是0.0-1.0。
当设置一个layer的frame时,position会根据anchorPoint设置其值。当设置一个position的值时,bounds的值会根据anchorPoint设置。
其他layer和view不相同的方面就是layer可以指定一个radius,此用来去圆滑layer的角。cornerRadius用来圆角一个layer。
layer的两个属性transform和sublayerTransform用于去指定转换矩阵。transfrom属性去指定矩阵应用到layer 中,sublayer相对与layer的anchorpoint。上面两个图分别给出了anchorPoint不一样的情况下转换矩阵的影响。 sublayerTransform属性指定的矩阵只应用的layer的sublayer上,而不是自己。
注意角度的旋转是弧度可不是角度,下面两个函数提供互转
core Animation是一个集成了图形绘制,映射,动画为一体的类库,使用先进的合成提供了一系列的动画,同时保留了一个一个hierarchical layer,cocoa touch view的结构中就有layer。总之core animation使你能够很简单的创建很复杂的动画。
此动画接口允许你在一个单独的线程运行动画,而独立与你的应用程序住循环。一旦一个动画配置并启动,core animation承担全部的责任。
因为layer在core Animation中起着基础的作用,所以下面先介绍layer。描述layer中个部分的几何形状,它们如何关联,以及如何变换矩阵产生复杂的视觉效果。
1.layer的坐标系统
2,layer的几何形状
layer和layer-tree在很多方面相似于view和view层次。但是几何形状里面的一些属性和view不一样,下面详细介绍,所有的layer的几何属性包括layer的转换矩阵都能动画。

(所有的图片都是在mac ox下的,在ios下其实也一样,只不过起始点变为了左上角)
position属性是一个CGPoint表示相对于superlayer的位置。
bounds属性是一个CGRect,提供layer的size(bounds.size)和(bounds.origin)。
frame 属性有bounds,anchorPoint,position属性共同决定,当frame改变时,layer的position和bounds的 size会改变已适用与frame。当一个layer的frame被设置时,bounds的origin不受干扰,但layer的size被设置成 frame的size。
layer的position被设置成恰当的位置相对于anchor point。当我们请求一个frame的属性,会通过positon bounds,anchorPoint属性计算得到。
anchorPoint属性是一个CGPoint,表示positon相对于bounds的位置。属于单元坐标系统。当为(0,0)时,接近于origin。当在父layer上应用一个transform上,可以改变anchorPoint的方向。
下图显示anchorPoint的三个值。

缺省的anchorPoint为(0.5,0,5),相对去layer bounds的中心,如上图A。

上图中anchorPoint缺省的为(0.5,0..5),其是layer的中心。layer的position设置为(100,100),bound设置为(0,0,120,80),这些属性使能计算出frame属性值为(40,60,120,80)。

上图设置anchorPoint为(0,0),当frame被设置为(40,60,120,80)时,bounds没有改变,但是position发生改变。
2.layer几何形状的转换
我们可以通过矩阵去转换一个layer的几何形状。转换数据结构定义了一个同质三维变换,(4*4的矩阵)用来去旋转,scale,offset,skew(歪斜),并应用角度转换到layer。
CGFloat DegreesToRadians(CGFloat degrees) {return degrees * M_PI / 180;}; |
CGFloat RadiansToDegrees(CGFloat radians) {return radians * 180 / M_PI;}; |