iOS動畫--核心動畫

? ? ? 核心動畫,即Core Animation,是Apple封裝的一組非常好用且強大的動畫API。它直接作用于Layer層,通過 - (void)addAnimation:(CAAnimation*)anim forKey:(nullableNSString*)key ,即可讓動畫生效。

? ? ? ?創(chuàng)建核心動畫,使用的是CAAnimation的子類,分別是基礎(chǔ)動畫(CABasicAnimation),關(guān)鍵幀動畫(CAKeyframeAnimation),轉(zhuǎn)場動畫(CATransition)和組動畫(CAAnimationGroup)。我做了個他們之間的關(guān)系草圖如下。


關(guān)系圖(CAMediaTimingFunction為動畫節(jié)奏)

? ? ? CAAnimationDelegate是核心動畫的代理,通過其可以在動畫開始與結(jié)束階段進行一些操作,不過需要注意的是在iOS9以前CAAnimationDelegate是CAAnimation的類別,之后才是代理,且為強引用。因此使用CAAnimationDelegate需判斷當(dāng)前系統(tǒng)版本,并且在當(dāng)前頁面dealloc之前需先動畫移除,否則會出現(xiàn)無法釋放的內(nèi)存問題。

? 下圖為我寫過的一個小動畫,分析一下其中使用的動畫來簡單介紹一下核心動畫。


核心動畫


1、CABasicAnimation基礎(chǔ)動畫

? ? ? ? GIF圖中,血量彈性變化,猴子轉(zhuǎn)身以及受傷抖動動畫都都使用了基礎(chǔ)動畫。受傷抖動動畫的代碼如下,

CABasicAnimation*Animation = [CABasicAnimationanimationWithKeyPath:@"position"];

Animation.fromValue= [NSValuevalueWithCGPoint:CGPointMake(pet.centerX, pet.centerY)];

Animation.toValue= [NSValuevalueWithCGPoint:CGPointMake(pet.centerX+5, pet.centerY)];

Animation.autoreverses=YES;

//Animation.beginTime=CACurrentMediaTime()+0.8;

//Animation.removedOnCompletion=NO;

Animation.fillMode=kCAFillModeBackwards;

Animation.repeatCount=10;

Animation.duration=0.02;//一次時間

屬性解析

? ? ? CABasicAnimationanimationWithKeyPath? ? 動畫路徑,告訴系統(tǒng)需要執(zhí)行的動畫類型 。position為位置,而猴子旋轉(zhuǎn)路徑則為transform.rotation.z。

? ? ? ?fromValue,toValue ? ?動畫的起始值與終止值

? ? ? ?autoreverses ? ?動畫是否沿原路徑返回

? ? ? fillMode? 分kCAFillModeForwards,kCAFillModeBackwards,kCAFillModeBoth,kCAFillModeRemoved四中模式。當(dāng)你設(shè)置removedOnCompletion值為NO時,kCAFillModeForwards可以讓當(dāng)前視圖保持在動畫最后的位置;當(dāng)你設(shè)置了延遲執(zhí)行時(beginTime),kCAFillModeBackwards會在代碼執(zhí)行時,使layer層進入動畫開始階段的位置,而結(jié)束后會返回layer本身位置;kCAFillModeBoth就很好理解了,如果removedOnCompletion = NO那layer會在動畫開始之前就會迅速進入動畫的初始位置并在執(zhí)行完動畫后停在動畫結(jié)束的位置,如果removedOnCompletion = YES那layer會在動畫開始之前就會迅速進入動畫的初始位置并在執(zhí)行完動畫后迅速返回到layer的本身位置。

? ? ? ?repeatCount ? 重復(fù)次數(shù)

? ? ? ? duration 動畫時間

血量彈性變化,使用的是基礎(chǔ)動畫的子類CASpringAnimation。它有幾個屬性,分別是

mass,對象質(zhì)量質(zhì)量越大彈性越大需要的動畫時間越長。

stiffness,剛度系數(shù),剛度系數(shù)越大,產(chǎn)生形變的力就越大,運動越快。

damping,阻尼系數(shù)阻止彈簧伸縮的系數(shù)阻尼系數(shù)越大,停止越快。時間越短。

initialVelocity,初始速度,正負代表方向,數(shù)值代表大小。

2,關(guān)鍵幀動畫與組動畫

GIF圖中,香蕉茄子的飛行動畫使用的為組動畫,組動畫中包含了兩個關(guān)鍵幀動畫和一個旋轉(zhuǎn)組動畫。CAAnimationGroup的animations屬性可以將動畫放到數(shù)組中,同時執(zhí)行。

其中物品的飛行過程中的大小變化代碼

CGFloatfrom3DScale =1+arc4random() %10*0.1;

CGFloatto3DScale =1;

CAKeyframeAnimation*Animation = [CAKeyframeAnimationanimationWithKeyPath:@"transform"];

Animation.values=@[[NSValuevalueWithCATransform3D:CATransform3DMakeScale(from3DScale, from3DScale, from3DScale)], [NSValuevalueWithCATransform3D:CATransform3DMakeScale(to3DScale, to3DScale, to3DScale)]];

Animation.timingFunctions=@[[CAMediaTimingFunctionfunctionWithName:kCAMediaTimingFunctionEaseOut], [CAMediaTimingFunctionfunctionWithName:kCAMediaTimingFunctionEaseIn]];

? ? ? ? ? 關(guān)鍵幀動畫相對于基礎(chǔ)動畫的區(qū)別是,CABasicAnimation只能從一個數(shù)值(fromValue)變到另一個數(shù)值(toValue),而CAKeyframeAnimation會使用一個NSArray保存這些數(shù)值。timingFunctions則是動畫的節(jié)奏。

飛行動畫代碼

CGMutablePathRefpathOne =CGPathCreateMutable();

CGPathMoveToPoint(pathOne,NULL, start.x, start.y);

CGPathAddQuadCurveToPoint(pathOne,NULL, start.x, -1, end.x, end.y);

CAKeyframeAnimation*animationOne = [CAKeyframeAnimationanimationWithKeyPath:@"position"];

[animationOnesetPath:pathOne];

animationOne.duration=1.2;

animationOne.fillMode=kCAFillModeForwards;

animationOne.removedOnCompletion=NO;

CFRelease(pathOne);

pathOne =nil;

? ? ? ? 飛行路徑的path可以通過CGPathRef\CGMutablePathRef繪制,讓層跟著路徑移動。path只對CALayer的anchorPoint和position起作用。如果你設(shè)置了path,那么values將被忽略。需要注意的是,需要手動繪制的路徑釋放。若想細致控制動畫,還可設(shè)置keyTimes,為對應(yīng)的關(guān)鍵幀指定對應(yīng)的時間點,其取值范圍為0到1.0,keyTimes中的每一個時間值都對應(yīng)values中的每一幀。當(dāng)keyTimes沒有設(shè)置的時候,各個關(guān)鍵幀的時間是平分的。

3,轉(zhuǎn)場動畫

? ? ? ? ?此GIF中沒有用到,它能夠為層提供移出屏幕和移入屏幕的動畫效果。其實UINavigationController就是通過CATransition實現(xiàn)了將控制器的視圖推入屏幕的動畫效果。說明一下它的幾個屬性。

type:動畫過渡類型

subtype:動畫過渡方向

startProgress:動畫起點(在整體動畫的百分比)

endProgress:動畫終點(在整體動畫的百分比)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容