定義:任何動畫要表現出運動或者變化,至少需要兩個不同的關鍵狀態,而中間的狀態的變化可以通過插值計算完成,從而形成補間動畫,表示關鍵狀態的幀叫做關鍵幀.
CABasicAnimation其實可以看作一種特殊的關鍵幀動畫,只有頭尾兩個關鍵幀.CAKeyframeAnimation則可以支持任意多個關鍵幀,關鍵幀有兩種方式來指定,使用path或者使用values,path是一個CGPathRef的值,且path只能對CALayer的 anchorPoint 和 position 屬性起作用,且設置了path之后values就不再起效了.而values則更加靈活. keyTimes這個可選參數可以為對應的關鍵幀指定對應的時間點,其取值范圍為0到1.0,keyTimes中的每一個時間值都對應values中的每一幀.當keyTimes沒有設置的時候,各個關鍵幀的時間是平分的.
CABasicAnimation基礎動畫只能從一個值變到另外一個值;只有三個屬性:
@property(nullable, strong) id fromValue;
@property(nullable, strong) id toValue;
@property(nullable, strong) id byValue;
CAKeyframeAnimation關鍵幀添加了許多的屬性:
//一個NSArray對象。里面的元素稱為”關鍵幀”(keyframe),動畫對象會在指定的時間(duration)內,依次顯示values數組中的每一個關鍵幀
@property(nullable, copy) NSArray *values;
//path : (畫圓、橢圓、貝塞兒曲線)可以設置一個CGPathRef\CGMutablePathRef,讓層跟著路徑移動,path只對CALayer的anchorPoint和position起作用,如果你設置了path,那么values將被忽略
@property(nullable) CGPathRef path;
@property(nullable, copy) NSArray*keyTimes;
//控制動畫快進慢出、慢進快出等特性
@property(nullable, copy) NSArray*timingFunctions;
@property(copy) NSString *calculationMode;
@property(nullable, copy) NSArray*tensionValues;
@property(nullable, copy) NSArray*continuityValues;
@property(nullable, copy) NSArray*biasValues;
@property(nullable, copy) NSString *rotationMode;
用例:
//注釋:
1.我們可以利用values來定義各個位置,來規劃直線路徑。
2.我們可以利用keypath來畫線,這樣規劃曲線路徑來進行動畫。
關鍵幀動畫的基礎步驟
1.決定你想要做動畫的屬性(例如,框架,背景,錨點,位置,邊框,等等)?
2.在動畫對象值的區域中,指定開始,結束,和中間的值。這些都是你的關鍵幀(看清單 4-2)
3.使用 duration 這個字段指定動畫的時間
4.通常來講,通過使用 times 這個字段,來給每幀動畫指定一個時間。如果你沒有指定這些,核心動畫就
會通過你在 values 這個字段指定的值分割出時間段。
5.通常,指定時間功能來控制步調。 這些都是你需要做的。你創建你的動畫和增加他們到層中。調用-addAnimation 就開始了動畫。
//注意:
calculationMode這個屬性非常重要:
計算模式.其主要針對的是每一幀的內容為一個座標點的情況,也就是對anchorPoint 和 position 進行的動畫.這個屬性用來設定, 關鍵幀中間的值是怎么被計算的。
CA_EXTERN NSString * const kCAAnimationLinear
//Simple linear calculation between keyframe values.
//簡單的線性計算,也是默認值。
CA_EXTERN NSString * const kCAAnimationDiscrete
//Each keyframe value is used in turn, no interpolated values are calculated.
//輪流使用關鍵值,無內插值參與計算,即離散的點。
CA_EXTERN NSString * const kCAAnimationPaced
//Linear keyframe values are interpolated to produce an even pace throughout the animation.
//通過內插值,均勻的進行動畫。
CA_EXTERN NSString * const kCAAnimationCubic
//Smooth spline calculation between keyframe values..
//光滑運算
CA_EXTERN NSString * const kCAAnimationCubicPaced
//Cubic keyframe values are interpolated to produce an even pace throughout the //animation.
//既光滑又勻速。