en

hi, it seems you are using microsoft internet explorer. it doesn't match web standard and causes problems browsing this site. please please please use mozilla firefox or google chrome instead. thank you!

zh

哦哦!您正在使用Internet Explorer 瀏覽器,它與我們的網頁標準並不相容,可能會導致畫面顯示不正常。
請改用 Mozilla Firefox 或者 Google Chrome 才能正常瀏覽本網站,謝謝!

5.26.2011

CABasicAnimation 的基本寫法

 

CABasicAnimation 或稱 CAAnimation 常使用在製作遊戲或是部份換場中的特殊效果,在撰寫上可以透過 Key-Value 來設定關鍵影格的物件位置與狀態,CAAnimation 將會透過此關鍵影格來執行動畫,下列程式碼將演示旋轉與移動這兩部份的程式碼。

在開始前由於我們有使用到 QuartzCore 的類別,所以必須要先匯入其標頭檔與 Framework。

#import <QuartzCore/QuartzCore.h>


如果不知道如何新增 Framework 的讀者們,可以參考 Xcode 4 新增 Framework 的方法一文。

接下來分別新增兩個按鈕事件並置入以下程式碼。

//旋轉
- (IBAction)onRotationButton:(id)sender {

    CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"transform.rotation.z"];

    //動畫速度
    animation.duration = 15.0;

    //次數
    animation.repeatCount = 0.21;

    //設定key值
    animation.toValue = [NSNumber numberWithFloat:-30.0];

    //執行動畫
    [imageView.layer addAnimation:animation forKey:@"transform.rotation.z"];

    //同時對不同軸做旋轉
    animation = [CABasicAnimation animationWithKeyPath:@"transform.rotation.x"];
    animation.duration = 15.0;
    animation.repeatCount = 0.21;
    animation.toValue = [NSNumber numberWithFloat:30.0];
    [imageView.layer addAnimation:animation forKey:@"transform.rotation.x"];
}

//移動
- (IBAction)onTranslationButton:(id)sender {

    CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"transform.translation.x"];
    animation.duration = 1.0;

    //循環
    animation.autoreverses = YES;
    animation.toValue = [NSNumber numberWithFloat:150.0];
    [imageView.layer addAnimation:animation forKey:@"transform.translation.x"];

    animation = [CABasicAnimation animationWithKeyPath:@"transform.translation.y"];
    animation.duration = 1.0;
    animation.autoreverses = YES;
    animation.toValue = [NSNumber numberWithFloat:-200.0];
    [imageView.layer addAnimation:animation forKey:@"transform.translation.y"];
}

如果重複次數希望是無限可以採用以下寫法。

animation.repeatCount = FLT_MAX;
上述兩個函式中的 Key 雖然說是字串型態,但是卻不可以任意填寫,其他相關的 Key 可以參考官方的 Core Animation Extensions To Key-Value Coding 部份。

最後值得一提的是,還有許多 Key 是在文件中沒有被寫出來的,像是 position,其作用是使 Layer 移動到畫面上得座標點,這與 translation 賦予 Layer 一個位移量是不同的。

//移動到畫面上的x座標位置
[CABasicAnimation animationWithKeyPath:@"position.x"]

//往x軸的方向移動
[CABasicAnimation animationWithKeyPath:@"transform.translation.x"]






6 則留言:

  1. 匿名3/25/2014

    哈囉,想請問一下
    animation.fromValue跟animation.byValue、animation.toValue這3個屬性所代表的意思是什麼
    翻了書跟網路上找些資料都看的一知半解

    回覆刪除
    回覆
    1. 您好:
      先給你看一下官方文件:
      https://developer.apple.com/library/ios/documentation/GraphicsImaging/Reference/CABasicAnimation_class/Introduction/Introduction.html
      你可以使用這三個直來決定動畫的行進過程,一開始這三個直在尚未設定時都是0,然後根據他們被腹語數值實惠做對應的動作,至於什麼動作,在文件中有詳細的說明,我大概翻譯了一兩句...
      Both fromValue and toValue are non-nil. Interpolates between fromValue and toValue.
      當fromValue 和 toValue都有被賦予非0的數值時,會使用插直的方式(循序漸進)從fromValue 漸進到toValue.如果是用用在上面的範例,就是以每次都增加或是減少等量的速度越轉越快或是越轉越慢。

      fromValue and byValue are non-nil. Interpolates between fromValue and (fromValue + byValue).
      這跟上面的意思類似但是如果是使用byValue,是在fromValue 和 fromValue + byValue 之間做插值,這樣可以讓插值的另一端(fromValue + byValue)是動態的數值,可以根據你fromValue來做調整。

      剩下的如果看不懂可以試著實作實驗看看。


      刪除
    2. 匿名3/25/2014

      如果以2D空間的動態我大概可以理解
      但如果是遇到transform.rotation.x/y/z這種翻轉的概念
      我就不太懂值該如何設置及計算toValue才能是我想要的效果
      感覺只能一個一個值慢慢測

      刪除
    3. 您好:
      xyz指的就是 上下、左右與前後(深度)
      只是我也不知道您到底想問什麼!?

      刪除
    4. 匿名3/25/2014

      我當初想問的問題是假設我的KeyPath是@"transform.rotation.x"
      那我的toValue該設置什麼樣的值才能讓我的圖片順著x軸繞一圈

      現在我搞懂了,只是要設置一個弧度給他(這是我當初不懂的地方)
      我在我的程式裡面設置
      CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"transform.rotation.x"];
      animation.duration = 1;
      animation.repeatCount = FLT_MAX;
      animation.toValue = [NSNumber numberWithFloat:2 * M_PI];
      來達到效果

      非常感謝牛奶大的例子^^

      刪除
    5. 您好:

      不客氣唷!!

      刪除