- 介紹
Core Animation 是一個非常強大的動畫處理 API,使用它能做出非常絢麗的動畫效果,而且往往是事半功倍,也就是說,使用少量的代碼就可以實現非常強大的功能。
蘋果封裝的 UIView 的 block 動畫就是對核心動畫的封裝,使用起來更加簡單。
絕大多數情況下,使用 UIView 的 block 動畫能夠滿足開發中的日常需求。
一些很酷炫的動畫,還是需要通過核心動畫來完成的。
- 支持的平臺
Core Animation 同時支持 MAC OS 和 iOS 平臺
Core Animation 是直接作用在 CALayer 的,并非 UIView。所以這個系列,咱們是從 CALayer 開始的。
Core Animation 的動畫執行過程都是在后臺操作的,不會阻塞主線程。
- Core Animation 的繼承結構圖
是所有動畫對象的父類,負責控制動畫的持續時間和速度、是個抽象類,不能直接使用,應該使用具體子類。需要注意的是CAAnimation 和 CAPropertyAnimation 都是抽象類。
view 是負責響應事件的, layer 是負責顯示的。
下面盜用了一張網絡上的圖片用來解釋繼承結構。
繼承結構圖
黃色的區塊是常用的屬性、方法或者需要遵守的協議,灰色的是名稱。
其中 CAAnimationGroup、CABasicAnimation、CAKeyFramkeAnimation 咱們會在下次更新中寫一些小例子。
- 常見屬性和使用步驟
4.1 使用步驟
通常分成三部完成:1,創建核心動畫對象;2,設置動畫屬性;3,添加到要作用的 layer 上。就想把大象放進冰箱需要三步一樣。哈哈~
4.2 常用屬性
就是咱們上面圖片中的小黃圖顯示的。
duration:持續時間,默認值是 0.25 秒
repeatCount: 重復次數,無線循環可以設置 HUGE_VALF 或者 CGFLOAT_MAX
repeatDuration: 重復時間
removeOnCompletion: 默認為 YES,代表動畫執行完畢后就從圖層上移除,圖形會恢復到執行動畫之前的狀態。如果想要圖層保持顯示動畫執行后的狀態,那就設置為 NO,同時設置 fillMode 為 kCAFillModeForwards
fillMode:決定當前對象在非 active 時間段的行為
beginTime:可以用來設置動畫延時執行,若想延遲 2s,就設置為CACurrentMediaTIme() + 2
CACurrentMediaTIme():圖層的當前時間
timingFunction: 速度控制函數,控制動畫運行節奏
delegate:動畫代理
4.3 animationWithKeyPath 中,常用的 keyPath
屬性名稱 類型 作用
transform.rotation.x CGFloat 或 float 繞 X 軸坐標旋轉 角度
transform.rotation.y CGFloat 或 float 繞 Y 軸坐標旋轉 角度
transform.rotation.z CGFloat 或 float 繞 Z 軸坐標旋轉 角度
transform.rotation CGFloat 或 float 作用與 transform.tation.z 一樣
transform.scale CGFloat 整個 layer 的比例
transform.scale.x CGFloat x 軸坐標比例變化
transform.scale.y CGFloat y 軸坐標比例變化
transform.scale.z CGFloat z 軸坐標比例變化
transform.translation CGMutablePathRef 整個 layer 的 xyz 軸都進行移動
transform.translation.x CGMutablePathRef 橫向移動
transform.translation.y CGMutablePathRef 縱向移動
transform.translation.z CGMutablePathRef 縱深移動
opacity CGFloat 透明度, 閃爍等動畫用 。范圍是 0~1
backgroundColor CGColor 背景顏色
cornerRadius CGFloat 圓
4.4 動畫填充模式
kCAFillModeForwards: 當動畫結束后,layer 會一直保持著動畫最后的狀態
kCAFillModeBackwards:在動畫開始前,只需要將動畫加入了一個 layer,layer 便立即進入動畫的初始狀態并等待動畫開始
kCAFillModeBoth:這個其實就是上面兩個合成,動畫加入后,開始之前,layer 便處于動畫初始狀態,動畫結束后 layer 保持動畫最后的狀態
kCAFillModeRemoved:這個是默認值,也就是說當動畫開始前和動畫結束后,動畫對 layer 都沒有影響,動畫結束后,layer 會恢復到之前的狀態 keyArc.calculationMode = kCAAnimationPaced;
4.5 速度控制函數
kCAMediaTimingFunctionLinear(線性):勻速,給你一個相對靜態的感覺
kCAMediaTimingFunctionEaseIn(漸進):動畫緩慢進入,然后加速離開
kCAMediaTimingFunctionEaseOut(漸出):動畫全速進入,然后減速的到達目的地
kCAMediaTimingFunctionEaseInEaseOut(漸進漸出):動畫緩慢的進入,中間加速,然后減速的到達目的地。這個是默認的動畫行為。 keyArc.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
是不是確實很枯燥?但是這條路本身就是大部分時間都很枯燥的啦~想逃也逃不掉。
這些屬性和方法也的確記不住,所以這一篇其實也就是自己總結整理了一下。以后再用的時候,看看自己總結的就好了。省得每次用的時候還要再去看一下文檔或者搜索了。