1. 程式人生 > >Core Animation(二)動畫基礎部分

Core Animation(二)動畫基礎部分

一、概要

上一篇簡單的描述了Core Animation相關的內容,並且親自動手實踐了一個動畫,同時也提到了“隱式動畫”和“顯示動畫”,也提到了UIKit動畫,可見iOS的動畫部分確實有些內容需要掌握,所以針對大體三個問題去研究學習:

1、為什麼使用動畫?有哪些好處?

2、動畫都有哪些實現方式?該注意什麼?

3、每種方式都是如何實現動畫的?區別是什麼?

二、動畫基礎

1、iOS動畫使介面互動變得生動,當介面控制元件屬性改變或者更新和切換檢視時放緩節奏,顯得不那麼突兀,增強了使用者體驗,所有好的互動動畫效果是一個App的亮點,是留住使用者比較關鍵的一點。

2、iOS中動畫一般有兩種方式實現UIKit方式和Core Animation方式,而UIKit方式是對Core Animation的進一步封裝,UIKit使用起來很方便,但也失去了一些靈活性。

(1)UIKit動畫:常見如UIView動畫和UIImageView序列幀動畫

a、通過動畫上下文來使用UIView動畫,此種方式在iOS3.2及更早版本被使用,iOS4以後支援書寫更簡單的Block方式

- (void) animationOfUIKit {
    UIView *testView = [[UIView alloc] initWithFrame:CGRectMake(80, 80, 200, 80)];
    testView.backgroundColor = [UIColor redColor];
    [self.view addSubview:testView];
    
    [UIView beginAnimations:@"Test Animation" context:nil];
    //設定動畫播放時間
    [UIView setAnimationDuration:3];
    //設定是否自動逆向播放
    [UIView setAnimationRepeatAutoreverses:YES];
    //設定重複播放次數
    [UIView setAnimationRepeatCount:100];
    //設定動畫曲線
    [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];
    //設定動畫事件
    [UIView setAnimationTransition:UIViewAnimationTransitionNone forView:self.view cache:YES];
    
    //設定代理
    [UIView setAnimationDelegate:self];
    [UIView setAnimationDidStopSelector:@selector(animationOfUIKitDidStop)];
    [UIView setAnimationWillStartSelector:@selector(animationOfUIKitStart)];
    
    testView.backgroundColor = [UIColor cyanColor];
    testView.frame = CGRectMake(80, 80, 100, 40);
    testView.alpha = 0.3;
    
    //提交併開始動畫
    [UIView commitAnimations];
}

- (void) animationOfUIKitStart {
    NSLog(@"animationOfUIKitStart");
}

- (void) animationOfUIKitDidStop {
    NSLog(@"animationOfUIKitDidStop");
}

b、通過Block方法使用UIView動畫
- (void) animationOfUIKitWithBlock {
    UIView *testView = [[UIView alloc] initWithFrame:CGRectMake(80, 80, 200, 80)];
    testView.backgroundColor = [UIColor redColor];
    [self.view addSubview:testView];
    
    [UIView animateWithDuration:3 delay:0
                        options:UIViewAnimationOptionRepeat |
                                UIViewAnimationOptionAutoreverse |
                                UIViewAnimationOptionCurveEaseInOut animations:^{
        testView.backgroundColor = [UIColor cyanColor];
        testView.frame = CGRectMake(80, 80, 100, 40);
        testView.alpha = 0.3;
    } completion:^(BOOL finished) {
        
    }];
}

注意:UIView動畫除了可以產生例子a和b中展示的背景顏色(backgroundColor)、框架(frame)、透明度(alpha)動畫,還可以展示的動畫有改變狀態(隱藏或顯示狀態)、改變檢視層次順序(調整檢視的index)、旋轉(檢視上應用仿射變換)。

c、UIImageView序列幀動畫

- (void) animationOfUIImageView {
    UIImageView *imageView = [[UIImageView alloc] initWithFrame:self.view.bounds];
    [self.view addSubview:imageView];
    
    imageView.animationImages = @[[UIImage imageNamed:@"bg.png"],
                                  [UIImage imageNamed:@"image_a.png"],
                                  [UIImage imageNamed:@"image_b.jpg"]];
    imageView.animationDuration = 5;
    imageView.animationRepeatCount = 10;
    [imageView startAnimating];
}

(2)Core Animation動畫

- (void) animationOfCoreAnimation {
    UIView *testView = [[UIView alloc] initWithFrame:CGRectMake(80, 80, 200, 80)];
    testView.backgroundColor = [UIColor redColor];
    [self.view addSubview:testView];
    
    CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"backgroundColor"];
    animation.toValue = (id)[UIColor cyanColor].CGColor;
    
    CABasicAnimation *animationFrame = [CABasicAnimation animationWithKeyPath:@"bounds"];
    animationFrame.fromValue = [NSValue valueWithCGRect:CGRectMake(80, 80, 200, 80)];
    animationFrame.toValue = [NSValue valueWithCGRect:CGRectMake(80, 80, 100, 40)];

    CAAnimationGroup* group = [CAAnimationGroup animation];
    group.animations = [NSArray arrayWithObjects:animation, animationFrame, nil];
    group.duration = 3.0;
    group.removedOnCompletion=NO;
    group.fillMode=kCAFillModeForwards;
    group.autoreverses = YES;
    group.repeatCount = 100;
    group.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
    
    [testView.layer addAnimation:group forKey:@"Changes"];
}

注意:Core Animation動畫除了可以提供UIView動畫能提供的效果之外,還可以根據你需要提供更加複雜和絢麗的動畫,例如推擠、揭開、覆蓋、波紋、吸收、翻頁、鏡頭開關效果、空間沿著曲線路徑非線性運動。

3、UIView動畫和Core Animation動畫聯絡和區別

步驟2中實現的幾個動畫,我們發現UIKit動畫和Core Animation動畫都可以實現相似的動畫效果,但要注意一下幾點:

UIView動畫和Core Animation動畫的區別

(1)UIKit動畫使用UIView呼叫,Core Animation則在view.layer中使用

(2)UIKit動畫呼叫簡單,而Core Animation呼叫則複雜一些

(3)UIKit動畫方式侷限較大,而Core Animation則自由很多,可以實現很多奇妙的設計

UIView動畫和Core Animation動畫的聯絡:

(1)實際上UIView是iOS系統中介面元素的基礎,所有頁面都繼承自UIView,但UIView真正的繪圖部分是CALayer,而Core Animation動畫主要在CALayer上操作

(2)但CALayer不能響應使用者事件,所以UIView更像是一個CALayer的管理器,訪問UIView的frame、bounds等屬性,實際上內部操作的是CALayer的frame、bounds等屬性。從繼承關係來看UIView繼承UIResponder,而CALayer繼承NSObject。UIView有一個屬性是layer(CALayer型別),所以理解起來就容易了。

注意:以上我們使用的UIKit和Core Animation動畫都是我們自己定義的,都屬於“顯示動畫”,當一個UI控制元件使用顯示動畫的時候,系統將不在提供“隱式動畫”。

接下來詳細學習Core Animation相關內容。

相關推薦

Core Animation動畫基礎部分

一、概要 上一篇簡單的描述了Core Animation相關的內容,並且親自動手實踐了一個動畫,同時也提到了“隱式動畫”和“顯示動畫”,也提到了UIKit動畫,可見iOS的動畫部分確實有些內容需要掌握,所以針對大體三個問題去研究學習: 1、為什麼使用動畫?有哪些好處? 2、

Core AnimationiOS圖形和動畫的初步認識

一、行業及平臺情況分析 在中國,一些發達城市,例如北、上、廣、深,都處於經濟高速發展階段,而人們的生活也越發的忙碌,時間高度碎片化,所以人們沒有很多時間坐在PC前,而都改用移動裝置,甚至現在一些大公司的部分辦公都依靠移動裝置,所以移動開發是將來一段時間的必然趨勢。 移動平臺

Python爬蟲小白---爬蟲基礎--Selenium PhantomJS

decode bject windows beautiful 結構 由於 target header 速度 一、前言    前段時間嘗試爬取了網易雲音樂的歌曲,這次打算爬取QQ音樂的歌曲信息。網易雲音樂歌曲列表是通過iframe展示的,可以借助Selenium獲

大數據入門第二十天——scala入門scala基礎

alt turn class 推斷 inf 循環 轉換 使用 mda 一、基礎語法   1.變量類型      // 上表中列出的數據類型都是對象,也就是說scala沒有java中的原生類型。在scala是可以對數字等基礎類型調用方法的。   2.變量聲明&mdas

Spark 的Core深入

hadoop spark SPARK RDD Spark 的 Core 深入(二)

Guava學習筆記基礎Joiner,Objects,Splitter及Strings

nonnull obj expect null dto 字符 情況 core cte 添加Maven依賴 JoinerTest import com.google.common.base.Joiner; import org.junit.Assert; import org

Android註冊程式編寫主函式部分

Android註冊程式編寫(二) (作者:Baron_wu 禁止轉載) 大家關注一下,順便點個讚唄 首先安裝外掛:butterknife 開啟file下的setting並選擇plugins(在browse): 在browserepository中搜索butterknif

Java基礎語法

一、第一個java程式,與註釋. 1.hello world程式書寫. public class HelloWorld { public static void main(String[] args) { System.out.println("Hel

Java基礎Java 基礎語法,小白趕緊來學習吧!

Java 基礎語法 一個Java程式可以認為是一系列物件的集合,而這些物件通過呼叫彼此的方法來協同工作。下面簡要介紹下類、物件、方法和例項變數的概念。 物件:物件是類的一個例項,有狀態和行為。例如,一條狗是一個物件,它的狀態有:顏色、名字、品種;行為有:搖尾巴、叫、吃等。 類:類

SmartGit 安裝及使用基礎用法

一、smartgit工作介面說明 1、點選window,根據選擇需要展示的模組。 2、各模組功能說明。 二、克隆專案 1、點選Repository,選擇clone 2、複製Git倉庫地址 3、選擇分支 4、選擇專案存放的路徑,點選完成 三、提交程式碼 1、

android之animationanimationset、interpolator

一: animationset: 他是一個animation的一個子類,實際上是animation的一個集合。他將animation放到一個list集合中。需要對animation的基本設定可以通過animationset來設定。如果需要對一個控制元件進行多種動畫設定,可以採用animat

耳朵:Linux部分命令

(一)LINUX 終端裝置:terminal 螢幕與鍵盤只是一個終端,可能不夠用,又不想增加裝置投入,就產生了虛擬終端。 顯示系統訊息的終端就叫控制檯,Linux預設所有虛擬終端都是控制檯,都能顯示系統訊息。 物理終端,控制檯:console 虛擬終端:按Ctr

Flutter學習之旅Flutter動畫1動畫基礎介紹

前言 本篇將介紹Flutter中動畫。首先來看下Flutter的動畫基礎概念和相關類 Animation:Flutter中動畫的核心類 AnimationController:動畫管理類 Tween:補間物件,用於計算動畫使用的資料範圍之間的插值。 Listeners

MySQL------SQL基礎

一、SQL簡介        SQL(Structure Query Language) 是結構化查詢語言,是關係型資料庫的應用語言,大多數關係型資料庫都支援SQL作為底層會話語言。 二、SQL使用入門       &

Swift教程_零基礎學習Swift完整例項_swift基礎簡單值、控制流、方法和閉包

三、Swift基礎介紹 本章將對Swift做一個簡單說明,內容取自《The Swift Programming Language》,並加之自己的理解。首先swift全域性作用域中的程式碼會被自動當做程

java程式設計師菜鳥進階oracle基礎詳解oracle查詢語句和資料排序

本文所以練習都是基於oracle自帶提供的一個數據庫進行的。資料庫中包含員工表emp。部門資訊表dept。員工工資工總表下面是三個表的表結構:一:基本查詢語句1.最簡單的查詢所有列語句Select * from emp;2.查詢指定列表的查詢語句Select empno ,e

Python資料分析基礎——NumPy基礎

NumPy最重要的特點就是其N維陣列物件(即ndarray),該物件是一個快速而靈活的大資料集容器。 陣列建立函式 函式 說明 array 將輸入資料(列表、元組、陣列或其他序列型別)轉換為ndarray。 asarray 將輸入轉換為ndarray ara

程式設計與演算法演算法基礎_北京大學 學習筆記

第一週 列舉 所有題目用python實現 例題1 完美立方 N=int(input ('N=')) for a in range(3,N+1): for b in range(

Numpy學習——Matplotlib基礎

Matplotlib 基礎 Matplotlib是一個類似Matlab的工具包,主要用來畫圖,主頁地址為:Matplotlib # 匯入 matplotlib 和 numpy: %pylab Using matplotlib backend: TkAg

Python爬蟲小白——爬蟲基礎——Selenium PhantomJS

前段時間嘗試爬取了網易雲音樂的歌曲,這次打算爬取QQ音樂的歌曲資訊。網易雲音樂歌曲列表是通過iframe展示的,可以藉助Selenium獲取到iframe的頁面元素, 而QQ音樂採用的是非同步載入的方式,套路不一樣,這是主流的頁面載入方式,爬取有點難度,不過也是對自己的一個挑戰。 二、Pyt