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