iOS開發——動畫編程OC篇&(一)基本動畫

來源:互聯網
上載者:User

標籤:

基本動畫

一、簡單介紹

Core Animation,中文翻譯為核心動畫,它是一組非常強大的動畫處理API,使用它能做出非常炫麗的動畫效果,而且往往是事半功倍。也就是說,使用少量的代碼就可以實現非常強大的功能。

Core Animation是跨平台的,可以用在Mac OS X和iOS平台。

Core Animation的動畫執行過程都是在後台操作的,不會阻塞主線程。不阻塞主線程,可以理解為在執行動畫的時候還能點擊(按鈕)。

要注意的是,Core Animation是直接作用在CALayer上的,並非UIView。

 

二、Core Animation的使用步驟

1.使用它需要先添加QuartzCore.framework架構和引入主標頭檔<QuartzCore/QuartzCore.h>(iOS7不需要)

2.初始化一個CAAnimation對象,並設定一些動畫相關屬性

3.通過調用CALayer的addAnimation:forKey:方法增加CAAnimation對象到CALayer中,這樣就能開始執行動畫了

4.通過調用CALayer的removeAnimationForKey:方法可以停止CALayer中的動畫

 

三、CAAnimation

類的繼承結構圖

  

CAAnimation是所有動畫類的父類,但是它不能直接使用,應該使用它的子類。

 常見屬性有:

duration:動畫的期間

repeatCount:動畫的重複次數

timingFunction:控制動畫啟動並執行節奏

說明:(1)能用的動畫類只有4個子類:CABasicAnimation、CAKeyframeAnimation、CATransition、CAAnimationGroup

     (2)CAMediaTiming是一個協議(protocol)。

CAPropertyAnimation是CAAnimation的子類,但是不能直接使用,要想建立動畫對象,應該使用它的兩個子類:CABasicAnimation和CAKeyframeAnimation

它有個NSString類型的keyPath屬性,你可以指定CALayer的某個屬性名稱 為keyPath,並且對CALayer的這個屬性的值進行修改,達到相應的動畫效果。比如,指定@"position"為keyPath,就會修改 CALayer的position屬性的值,以達到平移的動畫效果

 

四、補充說明

所有動畫對象的父類,負責控制動畫的期間和速度,是個抽象類別,不能直接使用,應該使用它具體的子類

屬性解析:(紅色代表來自CAMediaTiming協議的屬性)

duration:動畫的期間

repeatCount:動畫的重複次數

repeatDuration:動畫的重複時間

removedOnCompletion:預設為YES,代表動畫執行完畢後就從圖層上移除,圖形會恢複到動畫執行前的狀態。如果想讓圖層保持顯示動畫執行後的狀態,那就設定為NO,不過還要設定fillMode為kCAFillModeForwards

fillMode:決定當前對象在非active時間段的行為.比如動畫開始之前,動畫結束之後

beginTime:可以用來設定動畫順延強制時間,若想延遲2s,就設定為CACurrentMediaTime()+2,CACurrentMediaTime()為圖層的目前時間

timingFunction:速度控制函數,控制動畫啟動並執行節奏

delegate:動畫代理

  1 /**  2  自訂一個視圖,監聽手勢點擊操作,在手勢觸控螢幕幕時,產生動畫效果  3    4  1. 縮放  5  2. 旋轉  6    7  判斷動畫暫停和繼續的原則:  8    9  根據該動畫是點綴動畫(粒子效果)還是具有破壞性的動畫(例如大招、飛刀、子彈等) 10   11  如果是點綴動畫,失去焦點時不需要暫停 12  如果是破壞性動畫,失去焦點時需要暫停 13   14  3. 在本樣本中,退出後台暫停動畫,回到前台,繼續動畫 15   16  基本動畫簡單小結 17  1. 通過對CALayer的可動畫屬性進行修改,實現動畫 18  2. fromValue和toValue 19  3. 動畫使用的步驟: 20     1> 執行個體化 21     2> 定義屬性 22     3> 添加到圖層 23   24  注意點: 25     1> 迴圈播放的動畫,如果需要在恢複焦點後繼續,一定將RemovedOnCompletion屬性設定為NO 26     2> 針對平移動畫,需要在動畫結束的代理方法中,調整對象的位置 27     3> 如果要做無線迴圈動畫,可以如下設定 [anim setRepeatCount:HUGE_VALF]; 28     4> 關於暫停和繼續動畫,可以參照代碼 29  */ 30  31 - (void)viewDidLoad 32 { 33     [super viewDidLoad]; 34  35     UIView *myView = [[UIView alloc]initWithFrame:CGRectMake(50, 50, 100, 100)]; 36     [myView setBackgroundColor:[UIColor redColor]]; 37     [self.view addSubview:myView]; 38      39     self.myView = myView; 40 } 41  42 #pragma mark - 觸摸方法 43 - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 44 { 45     // 判斷myView是否已經開始旋轉,如果已經旋轉,就停止 46     CAAnimation *anim = [self.myView.layer animationForKey:@"rotationAnim"]; 47     if (anim) { 48         // 停動畫 49 //        [self.myView.layer removeAllAnimations]; 50         // 如果動畫處於暫停,就繼續,如果播放中就暫停 51         // 可以根據myView.layer.speed來判斷,speed == 0,暫停 52         if (self.myView.layer.speed == 0.0) { 53             [self resumeAnimation]; 54         } else { 55             [self pauseAnimation]; 56         } 57     } else { 58         [self rotationAnimation]; 59     } 60 } 61  62 #pragma mark - 動畫的暫停和恢複 63 #pragma mark 動畫暫停 64 - (void)pauseAnimation 65 { 66     // 1. 取出當前的動畫的時間點,就是要暫停時間點 67     CFTimeInterval pauseTime = [self.myView.layer convertTime:CACurrentMediaTime() fromLayer:nil]; 68     // 2. 設定動畫的時間位移量,指定時間位移量的目的是讓動畫定格在該時間點 69     [self.myView.layer setTimeOffset:pauseTime]; 70      71     // 3. 將動畫的運行速度設定為0,動畫預設的運行速度是1.0 72     [self.myView.layer setSpeed:0.0]; 73 } 74  75 #pragma mark 恢複動畫 76 - (void)resumeAnimation 77 { 78     // 1. 將動畫的時間位移量作為暫停時的時間點 79     CFTimeInterval pauseTime = self.myView.layer.timeOffset; 80     // 2. 根據媒體時間計算出準確的啟動動畫時間,對之前暫停動畫的時間進行修正 81     CFTimeInterval beginTime = CACurrentMediaTime() - pauseTime; 82      83     // 3. 要把位移時間清零 84     [self.myView.layer setTimeOffset:0.0]; 85     // 4. 設定圖層的開始動畫時間 86     [self.myView.layer setBeginTime:beginTime]; 87      88     [self.myView.layer setSpeed:1.0]; 89 } 90  91 #pragma mark - 動畫方法 92 #pragma mark 旋轉動畫 93 - (void)rotationAnimation 94 { 95     // 1. 執行個體化基本動畫 96     // 預設按照z軸旋轉 97     CABasicAnimation *anim = [CABasicAnimation animationWithKeyPath:@"transform.rotation.z"]; 98      99     [self.myView.layer setAnchorPoint:CGPointMake(0, 0)];100     101     // 2. 設定動畫屬性102     // 不停的旋轉103     // 1) 旋轉一周104     [anim setToValue:@(2 * M_PI)];105     // 2) 不停的旋轉 - 動畫迴圈播放106     // HUGE_VALF 是一個非常大得浮點數,指定此數值可以認為動畫無限迴圈107     // MAXFLOAT 108     [anim setRepeatCount:HUGE_VALF];109     110     [anim setDuration:0.5f];111     112     // 3) 動畫完成時刪除113     // 對於迴圈播放的動畫效果,一定要將removedOnCompletion設定為NO,否則無法恢複動畫114     [anim setRemovedOnCompletion:NO];115     116     // 3. 添加動畫117     // key可以隨便指定,用於判斷圖層中是否存在該動畫118     [self.myView.layer addAnimation:anim forKey:@"rotationAnim"];119 }120 121 #pragma mark 縮放動畫122 - (void)scaleAnimation123 {124     // 1. 執行個體化基本動畫125     CABasicAnimation *anim = [CABasicAnimation animationWithKeyPath:@"transform.scale"];126     127     // 2. 設定動畫屬性128     // fromValue & toValue129     [anim setFromValue:@(1.0)];130     // 從當前大小縮小到一半,然後恢複初始大小131     [anim setToValue:@(0.5)];132     // 自動翻轉動畫133     [anim setAutoreverses:YES];134     135     // 動畫時間長度136     [anim setDuration:0.5f];137     138     // 3. 將動畫添加到圖層139     [self.myView.layer addAnimation:anim forKey:nil];140 }

 

  

iOS開發——動畫編程OC篇&(一)基本動畫

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.