Core Animation 学习笔记

原博客网址

http://www.cnblogs.com/xdream86/p/3250782.html


Core Animation 是iOS与OS X 平台上负责图形渲染与动画的

它被紧密的集成到了Cocoa和Cocoa Touch试图工作流中。

  


UIKit/AppKit

Core Animation

OpenGL ES/OpenGL  Core Graphics

Graphics Hardware


Core Animation的核心是图层对象,图层对象用于管理和操控你的应用内容。

图层将捕获的内容放到一副位图中,图形硬件能够非常容易的操控你的位图。


Core Animation 创建的大部分动画都包含对图层属性的更改。大部分属性的更改会触发隐式动画被创建。

隐式动画是一种从旧属性值到新属性值的动画形式。

如果需要全面掌控动画行为,你可以考虑使用显示动画这些属性。


大部分图层不做实际的绘图操作。相反,图层捕获应用的内容并缓存它们到位图中。位图—储备。当你随后改变了一个属性值,你做的所有只是改变了与图层对象相关联的状态信息。当你的改变出发了一个动画,Core Animation传递图层的位图和图层的状态个图形处理硬件。图形处理器所做的工作是使用获得的信息渲染位图,

用图形处理硬件操纵位图要比图形处理软件能获得更高的动画效果。


因为操纵的是静态的位图,基于涂层的绘图和基于视图的绘图在技术上有明显的不同。

基于视图的绘图,对视图的改变经常会触发调用试图的drawRect: 方法以重绘视图内容。但是此种方式的代价较高,因为他是CPU在主线程上的操作。

Core Animation 通过近可能的使用图形硬件操纵缓存后的位图来避免了这种开销,从而完成相同或相似的效果。


虽然Core Animation 尽可能地使用缓存后的内容,但也必须提供初始内容并不时地更新它。


基于图层的动画

位置,透明度。。。


图层定义了自己的结构

frame,bound

anchor试图没有的


图层使用两种类型的坐标系统

基于点的坐标系统:frame,bounds

单位坐标系统:anchorPoint ,总数的百分比(0.0–1.0)


图层的几何操作是相对于图层的锚点进行的,anchorPoint属性可以访问图层的锚点值。当改变图层的position和transform属性值,锚点的影响就很明显。position属性是相对于图层的锚点被指定。并且任何你对图层阴影的变换操作也是相对于锚点。


图层可以在三维空间中操作

图层有两个操控图层和内容的变换矩阵,transform和sublayerTransform属性。

CALayer的transform属性用来指定应用到图层和它内嵌的子层上的变换。

sublayerTransfrom属性定义了应用在子层上的变换以及给场景内容添加透视效果。


恒等变换

 1 0 0 0

0 1 0 0

0 0 1 0

0 0 0 1


平移

1 0 0 0

0 1 0 0

0 0 1 0

tx ty tz 1


缩放

sx 0 0 0

0 sy 0 0

0 0 sz 0

0 0 0 1

绕X轴旋转

1 0 0 0

0 cos sin 0

0 -sin   cos 0

0 0 0 1

绕y轴

cos 0 -sin 0

0 1 0 0

sin 0 cos 0

0 0 0 1

绕z轴

cos sin 0 0

-sin cos 0 0

0 0 1 0

0 0 0 1

不同的图层树反应了不同的动画状态

使用Core Animation的app拥有三个图层对象集合。每一个图层对象集合在呈现app内容上都扮演者不同的角色。


模型图层树中的对象(简称“图层树”)。在这个树种的对象是模型对象,模型对象负责存储所有动画目标值。无论何时改变图层的属性值,你使用的始终是某一个模型对象。


呈现树中的对象包含所有运行中的动画的瞬间值。图层树对象包含的是动画的目标值,而呈现树中的对象代表显示在屏幕上动画的当前值。你不应该更改这个树中的对象。相反,你使用这些对象来读取当前动画的值,可能用于创建开始于这些值的心得动画。

渲染树执行实际的动画,并且对CoreAnimation是不公开的。

在图层树中的每一个对象,在渲染树和呈现树中也存在一个与之匹配的对象。


@使用图片为图层提供内容

因为一个图层仅是管理位图图片的容器,所以你可以直接赋值一个图片给图层的contents属性。


@使用代理提供图层的内容

如果图层的内容是动态改变的,你可以使用一个代理对象在需要的时候提供图层并更新内容。图层显示的时候,图层调用你的代理方法以提供需要的内容:

》如果你的代理实现了displayLayer:方法,实现方法负责创建位图并赋值给contents属性。

》如果你的代理实现的时displayLayer:inContext方法之一。如果代理对象把两个方法都实现了,图层知道用display:方法。


@由子类提供图层的内容


当子类化图层类,你可使用两种方式绘制你的图层内容:

覆盖图层的display方法并使用在方法中直接设置图层的contents属性。

覆盖图层的drawInContext:方法并将需要的内容绘制到提供的图形上下文中。


@调整提供的内容

当给图层的contents属性赋值一个图片,图层的contentsGravity属性确定图片如何适合当前的边界。默认情况下,如果一个图片大于小于当前的边界,图层对象缩放图片以适应有效地空间。如果图层的长宽比和图片的长宽比不一致,这回导致图片扭曲。所以你可以使用contentsGravity属性来确定你的内容以最佳的方式被呈现。


你可以像contentsGravity属性赋予的值分为两个分类:

》基于位置的引力约束允许你固定你的图片到图层矩形边界的一个特殊的边缘或角落,不会缩放图片;

kCAGravityCenter 裁剪  或不能填充满图层

》基于缩放的引力约束允许你伸缩图片使用多个选项之一,某些选项保留长宽比,有些不保留。

kCAGravityResize 唯一不保留图片长宽比的选项

@使用高分辨率的图片

[[UIScreen mainScreen] scale]


@调整图层的可视样式和外观


@图层拥有自己的背景和边框

背景被渲染在图层的内容图片的后方,边框被渲染在内容图片的前方。







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值