詳解CoreAnimation中如何自定義動畫屬性
CoreAnimation中如何自定義動畫屬性是本文要介紹的內容,CoreAnimation可以對UIView里的CALayer進行動畫處理。它的原理很簡單,用戶提供一個初始值,終點值和動畫持續時間,CoreAnimation自動對 初始值,終點值之間,按照動畫持續時間進行插值(生成中間值),生成中間幀,然后在一個單獨的線程里進行播放,程序員就不再需要自己去繪制中間幀。
CoreAnimation在對CALayer進行動畫生成時,需要用戶指定對CALayer的哪一個屬性進行插值,也就是必須聲明成@property的變量,使用各個動畫的虛擬超類CAPropertyAnimation的animationWithKeyPath方法來指定,例如下面的代碼說明要對CALayer的postion屬性進行插值。
- CABasicAnimation *aBasicAnimation = [CABasicAnimation animationWithKeyPath:@"position"];
在缺省情況下,能對 CALayer指定的動畫屬性是固定的,例如bounds,postion,可以在XCode的開發文檔里查到,但是有的時候,我們需要對自定義的屬性進行動畫生成,這個就需要子類化CALayer,重載它的needsDisplayForKey方法
- + (BOOL)needsDisplayForKey:(NSString *)aKey {
- if ([aKey isEqualToString:@"myProperty"]) {
- return (YES);
- } else {
- return ([super needsDisplayForKey:aKey]);
- }
- }
在這里,告訴CoreAnimation,我的CALayer子類有一個 myProperty屬性,請對它進行動畫插值。接下來,就可以重載
drawInContext方法,添加自己的關鍵幀繪畫代碼了。
子類化CALayer時,有個地方要注意,因為CoreAnimation在生成中間幀的方式,是通過Copy操作生成了一大堆中間幀用的CALayer,它在復制CALayer的數據時,只能對CALayer原有的屬性成員進行copy,不會copy后添加的諸如對象引用一類的東西,這就需要程序員重載
- - (id)initWithLayer:(id)layer
- {
- self = [super initWithLayer:layer];
- if(self != nil) {
- MyLayer *myLayer = (MyLayer*)layer;
- self.aUIImage = cl.aUIImage;
- }
- return (self);
- }
來生動copy一些沒法自動copy的資源。
寫些小提示,像 drawInContex之類的繪圖方法中,盡量避免CGContextDrawImageInRect之類的元繪圖調用,因為這些元繪圖操作非常耗時,也是硬件加速幫不上忙的地方,盡量通過將CGImageRef傳給CALayer.contents屬性的方法把內容事先做好傳給CALayer,然后通過仿射或者3D transform的方法來進行動畫變換, 因為仿射或者3D transform是完全硬件加速的,它比自己書寫繪圖代碼要快的多的多。
小結:詳解CoreAnimation中如何自定義動畫屬性的內容介紹完了,希望本文對你有所幫助!