亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > iOS > 正文

iOS的CoreAnimation開發框架中的Layer層動畫制作解析

2020-07-26 03:18:51
字體:
來源:轉載
供稿:網友

CAAnimation動畫體系的介紹
CAAnimation是CoreAnimation框架中執行動畫對象的基類,下面有一張圖,是我手畫的,不太美觀,但是可以將與CAAnimation相關的幾個動畫類的關系表達清楚:

20167693334528.png (719×475)

從上圖中可以看到,從CAAnimation中繼承出三個子類,分別是用于創建屬性動畫的CAPropertyAnimation,創建轉場動畫的CATransition和創建組合動畫的CAAnimationGroup。

我們就先從根類開始探討。

1.CAAnimation屬性和方法

CAAnimation作為動畫對象的基類,其中封裝了動畫的基礎屬性,如下:

//通過類方法創建一個CAAnimation對象
+ (instancetype)animation;
//動畫執行的時序模式
@property(nullable, strong) CAMediaTimingFunction *timingFunction;
//代理
@property(nullable, strong) id delegate;
//是否動畫完成時將動畫對象移除掉
@property(getter=isRemovedOnCompletion) BOOL removedOnCompletion;
timingFunction定義了動畫執行的時序效果,CAMediaTimingFunction的創建方式如下:

/*
name參數決定的執行的效果,可選參數如下
//線性執行
 NSString * const kCAMediaTimingFunctionLinear;
 //淡入  在動畫開始時 淡入效果
 NSString * const kCAMediaTimingFunctionEaseIn;
 //淡出 在動畫結束時 淡出效果
 NSString * const kCAMediaTimingFunctionEaseOut;
 //淡入淡出
 NSString * const kCAMediaTimingFunctionEaseInEaseOut;
 //默認效果
 NSString * const kCAMediaTimingFunctionDefault;
*/
+ (instancetype)functionWithName:(NSString *)name;
CAAnimation的代理方法入如下幾個:

//動畫開始時執行的回調
- (void)animationDidStart:(CAAnimation *)anim;
//動畫結束后執行的回調
- (void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag;
2.CAPropertyAnimation屬性與方法

CAPropertyAnimation是繼承于CAAnimation專門用來創建與屬性相關的動畫的類:

//創建對象 參數中的path就是我們要執行動畫的屬性
//例如,如果傳入@"backgroundColor" 當layer的背景顏色改變時,就會執行我們設置的動畫
+ (instancetype)animationWithKeyPath:(nullable NSString *)path;
//這個屬性確定動畫執行的狀態是否疊加在控件的原狀態上
//默認設置為NO,如果我們執行兩次位置移動的動畫,會從同一位置執行兩次
//如果設置為YES,則會在第一次執行的基礎上執行第二次動畫
@property(getter=isAdditive) BOOL additive;
//這個屬性對重復執行的動畫有效果
//默認為NO,重復執行的動畫每次都是從起始狀態開始
//如果設置為yes,則為此執行都會在上一次執行的基礎上執行
@property(getter=isCumulative) BOOL cumulative;
//這個屬性和transfron屬性的動畫執行相關
@property(nullable, strong) CAValueFunction *valueFunction;
上面這些屬性中,只有一個需要我們注意,valueFunction是專門為了transform動畫而設置的,因為我們沒有辦法直接改變transform3D中的屬性,通過這個參數,可以幫助我們直接操作transfrom3D屬性變化產生動畫效果,舉例如下,一個繞Z軸旋轉的動畫:

 //繞z軸旋轉的動畫
    CABasicAnimation * ani = [CABasicAnimation animationWithKeyPath:@"transform"];
    //從0度開始
    ani.fromValue = @0;
    //旋轉到180度
    ani.toValue = [NSNumber numberWithFloat:M_PI];
    //時間2S
    ani.duration = 2;
    //設置為z軸旋轉
    ani.valueFunction = [CAValueFunction functionWithName:kCAValueFunctionRotateZ];
    //執行動畫
    [layer addAnimation:ani forKey:@""];
實際上,使用點的方式也是可以訪問到相應屬性的,如果不設置valueFunction,使用如下方法也是可以進行繞Z軸旋轉的:

//繞z軸旋轉的動畫
    CABasicAnimation * ani = [CABasicAnimation animationWithKeyPath:@"transform.rotation.z"];
    //從0度開始
    ani.fromValue = @0;
    //旋轉到180度
    ani.toValue = [NSNumber numberWithFloat:M_PI];
    //時間2S
    ani.duration = 2;
    //執行動畫
    [layer addAnimation:ani forKey:@""];

3.CABasicAnimation屬性

CABasicAnimaton是CAPropertyAnimation分出來的一個子類,創建基礎的屬性變化動畫,例如我們上面的示例代碼,其中屬性如下:

@property(nullable, strong) id fromValue;
@property(nullable, strong) id toValue;
@property(nullable, strong) id byValue;
上面三個屬性都是來確定動畫的起始與結束位置,有如下的含義:

(1)fromValue和toValue不為空:動畫的值由fromValue變化到toValue

(2)fromValue和byValue不為空:動畫的值由fromValue變化到fromValue+byValue

(3)byValue和toValue不為空:動畫的值由toValue-byValue變化到toValue

(4)只有fromValue不為空:動畫的值由fromValue變化到layer的當前狀態值

(5)只有toValue不為空:動畫的值由layer當前的值變化到toValue

(6)只有byValue不為空:動畫的值由layer當前的值變化到layer當前的值+byValue

4.CAKeyframeAnimation關鍵幀動畫

CAKeyframeAnimation也是繼承與CAPropertyAnimation的一個子類,其與CABasicAnimation的不同之處在于雖然其都是改變layer層屬性的動畫,但是CABasicAnimation只能設置初始與結束狀態,這之間我們沒辦法控制,而CAKeyframeAnimation可以讓我們設置一些關鍵幀再整個動畫的過程中。屬性方法如下:

//關鍵幀的值數組 例如我們想讓控件沿某個路徑移動,這里面存放每個移動的點
@property(nullable, copy) NSArray *values;
//直接設置路徑,作用域values類似
@property(nullable) CGPathRef path;
//設置每一幀執行的時間長短 這個的取值為0-1,代表占用時間的比例
@property(nullable, copy) NSArray<NSNumber *> *keyTimes;
//每一幀執行過程中的時序效果 上面有提過
@property(nullable, copy) NSArray<CAMediaTimingFunction *> *timingFunctions;
/*
設置幀的中間值如何計算
 NSString * const kCAAnimationLinear;
 NSString * const kCAAnimationDiscrete;
 NSString * const kCAAnimationPaced;
 NSString * const kCAAnimationCubic;
 NSString * const kCAAnimationCubicPaced;
*/
@property(copy) NSString *calculationMode;
示例如下:

    CAKeyframeAnimation * ani = [CAKeyframeAnimation animationWithKeyPath:@"position"];
    ani.values = @[[NSValue valueWithCGPoint:CGPointMake(100, 100)],[NSValue valueWithCGPoint:CGPointMake(120, 100)],[NSValue valueWithCGPoint:CGPointMake(120, 200)],[NSValue valueWithCGPoint:CGPointMake(200, 200)]];
    ani.duration = 3;
    [layer addAnimation:ani forKey:@""];
5.CASpringAnimation阻尼動畫

通過CASpringAnimation,可以幫助開發者很輕松的創建出有彈簧效果的動畫,主要屬性如下:

//這個屬性設置彈簧重物的質量 會影響慣性 必須大于0 默認為1
@property CGFloat mass;
//設置彈簧的剛度系數,必須大于0 默認為100  這個越大 則回彈越快
@property CGFloat stiffness;
//阻尼系數 默認為10 必須大于0 這個值越大 回彈的幅度越小
@property CGFloat damping;
//初始速度
@property CGFloat initialVelocity;
//獲取動畫停下來需要的時間
@property(readonly) CFTimeInterval settlingDuration;
6.CATransition轉場動畫

CATransition和CAPropertyAnimation的不同之處在于當layer層出現時,會產生動畫效果,而并不是屬性改變時,屬性如下:

/*
設置動畫類型
//淡入
 NSString * const kCATransitionFade;
 //移入
 NSString * const kCATransitionMoveIn;
 //壓入
 NSString * const kCATransitionPush;
 //溶解
 NSString * const kCATransitionReveal;
*/
@property(copy) NSString *type;
/*
設置動畫的方向
//從右側進
 NSString * const kCATransitionFromRight;
 //從左側進
 NSString * const kCATransitionFromLeft;
 //從上側進
 NSString * const kCATransitionFromTop;
 //從下側進
 NSString * const kCATransitionFromBottom;
*/
@property(nullable, copy) NSString *subtype;
其實,關于type定義的動畫效果,出來官方定義的,我們還可以使用一些私有的參數,如下:

(1)pageCurl   翻頁
(2)rippleEffect 滴水效果
(3)suckEffect 收縮效果,如一塊布被抽走
(4)cube 立方體效果
(5)oglFlip 上下翻轉效果
例如:

    CATransition * ani = [CATransition animation];
    ani.type =  @"pageCurl";
    ani.subtype = kCATransitionFromRight;
    [layer addAnimation:ani forKey:@""];
7.CAAnimationGroup動畫組

 CAAnimationGroup本身并沒有定義動畫,他可以將我們上面提到的相關動畫進行組合:

@property(nullable, copy) NSArray<CAAnimation *> *animations;

高級動畫技巧
1.事務類

CoreAnimation中還有一個非常重要的類:CATransaction事物類,這個可以同時設置多個layer層的動畫效果??梢酝ㄟ^隱式和顯式兩種方式來進行動畫操作。

2.CATransaction屬性

對layer層的屬性操作,都會形成隱式動畫,要使用隱式動畫,需要關閉layer層的animation動畫屬性,使用下面的方法:

//關閉animation動畫效果,開啟隱式動畫
+ (BOOL)disableActions;
+ (void)setDisableActions:(BOOL)flag;
CATransaction用類方式通過設置key-value來進行動畫的屬性設置:

+ (nullable id)valueForKey:(NSString *)key;
+ (void)setValue:(nullable id)anObject forKey:(NSString *)key;
支持的key值如下:

//設置動畫持續時間
 NSString * const kCATransactionAnimationDuration;
 //設置停用animation類動畫
 NSString * const kCATransactionDisableActions;
 //設置動畫時序效果
 NSString * const kCATransactionAnimationTimingFunction;
 //設置動畫完成后的回調
 NSString * const kCATransactionCompletionBlock;
除了隱式的展示動畫外,也可以顯式的通過調用CATransaction的相關方法進行顯示的提交動畫:

//動畫開始
+ (void)begin;
//提交動畫
+ (void)commit;
//立即進行動畫渲染 一般不需調用
+ (void)flush;
//下面這兩個方法用于動畫事物的加鎖與解鎖 在多線程動畫中,保證修改屬性的安全
+ (void)lock;
+ (void)unlock;
示例如下:

[CATransaction begin];
[CATransaction setValue:@1 forKey:kCATransactionAnimationDuration];
layer.backgroundColor = [UIColor blueColor].CGColor;
[CATransaction commit];

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久视频这里只有精品| 亚洲福利视频网| 欧美中文字幕精品| 91国产中文字幕| 亚洲第一av网| 国产午夜精品麻豆| 浅井舞香一区二区| 久久久久久一区二区三区| 国产精品久久久久久久一区探花| 日韩欧亚中文在线| 日韩精品免费在线播放| 欧美国产高跟鞋裸体秀xxxhd| 在线亚洲国产精品网| 亚洲第一色在线| 91高清免费视频| 综合网中文字幕| 欧美丰满少妇xxxxx做受| 国产中文字幕亚洲| 日本欧美黄网站| 91高清视频免费| 亚洲欧美日韩国产中文| 欧美精品videossex88| 国产亚洲免费的视频看| 亚洲天堂男人的天堂| 欧美亚洲国产日本| 成人在线一区二区| 国产精品久久久久久久久免费看| 91久久精品国产| 欧美孕妇性xx| 日韩高清a**址| 欧美一区亚洲一区| 亚洲视频专区在线| 成人免费视频a| 久久成人一区二区| 亚洲午夜小视频| 成人xxxxx| 亚洲国产精品热久久| 欧美激情在线狂野欧美精品| 亚洲国产精品va在看黑人| 久久综合久中文字幕青草| 日韩中文在线中文网三级| 一色桃子一区二区| 日韩精品极品视频免费观看| 精品国产一区二区三区在线观看| 97久久精品视频| 夜夜嗨av一区二区三区免费区| 性色av一区二区三区在线观看| 亚洲精品国产精品自产a区红杏吧| www.亚洲一二| 久久久女人电视剧免费播放下载| 亚洲欧美国产精品久久久久久久| 国产成人一区二区三区电影| 欧美精品在线免费播放| 日韩美女免费视频| 久久天天躁狠狠躁夜夜躁2014| 国产精品中文久久久久久久| 中国日韩欧美久久久久久久久| 2018国产精品视频| 国产亚洲aⅴaaaaaa毛片| 国产69精品99久久久久久宅男| 91亚洲va在线va天堂va国| 狠狠色噜噜狠狠狠狠97| 欧美成人一区二区三区电影| 韩国欧美亚洲国产| 国产精品久久久久久超碰| 国产精品福利网| 精品国产91乱高清在线观看| 午夜精品久久久久久久白皮肤| 欧美精品在线播放| 中文字幕精品影院| 欧美一区二区三区图| 久久视频中文字幕| 国产不卡在线观看| 亚洲网在线观看| 2023亚洲男人天堂| 国内揄拍国内精品少妇国语| 亚洲成人在线视频播放| 国产乱肥老妇国产一区二| 亚洲白拍色综合图区| 国产精品第2页| 琪琪第一精品导航| 日韩在线观看av| 在线播放日韩欧美| 亚洲国产精品va在线看黑人| 国产在线视频不卡| 亚洲天堂成人在线视频| 国产在线观看精品| 国产亚洲欧洲高清一区| 日韩在线视频二区| 91产国在线观看动作片喷水| 久久亚洲精品视频| 亚洲欧美日韩国产精品| 亚洲欧美国产日韩中文字幕| 亚洲嫩模很污视频| 欧美视频中文字幕在线| 精品动漫一区二区三区| 欧美乱妇高清无乱码| 91欧美精品午夜性色福利在线| 日韩av手机在线看| 国产精品久久国产精品99gif| 欧美老女人性视频| 亚洲片国产一区一级在线观看| 成人深夜直播免费观看| 亚洲影院色在线观看免费| 国产女人精品视频| 久久色在线播放| 国语自产精品视频在免费| 欧美激情亚洲激情| 国产成人精品在线观看| 国产一区二区三区高清在线观看| 国产91精品不卡视频| 91精品久久久久久久| 亚洲成人教育av| 中文字幕精品久久久久| 日韩亚洲欧美成人| 亚洲精品aⅴ中文字幕乱码| 热re99久久精品国产66热| 一区二区三区 在线观看视| 黑人欧美xxxx| 亚洲美女又黄又爽在线观看| 亚洲精品狠狠操| 亚洲国产免费av| 欧美另类极品videosbest最新版本| 日韩亚洲精品视频| 久久久久国产精品www| 亚洲人成网站免费播放| 成人激情av在线| 亚洲精品国产精品国产自| 久久91精品国产91久久跳| 在线看福利67194| 国内精品一区二区三区四区| 亚洲精品自产拍| 成人亚洲激情网| 萌白酱国产一区二区| 亚洲色图五月天| 国产精品免费久久久久久| 亚洲性猛交xxxxwww| 伊人一区二区三区久久精品| 夜夜嗨av一区二区三区四区| 永久免费精品影视网站| 亚洲午夜未满十八勿入免费观看全集| 欧美色另类天堂2015| 国产成人精品电影久久久| 成人激情综合网| 国产精品视频专区| 国产在线精品成人一区二区三区| 欧美精品一本久久男人的天堂| 亚洲欧美日韩另类| 国产精品嫩草视频| 日韩经典中文字幕在线观看| 国产精品美女av| 97免费在线视频| 视频在线一区二区| 日本成人免费在线| 亚洲jizzjizz日本少妇| 日韩在线免费视频观看| 国产精品白丝jk喷水视频一区| 欧美一区三区三区高中清蜜桃| 欧美另类极品videosbestfree| 91在线网站视频| 日本91av在线播放| 欧美午夜片欧美片在线观看| 欧美色播在线播放| 伊人久久久久久久久久|