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"]
哈囉,想請問一下
回覆刪除animation.fromValue跟animation.byValue、animation.toValue這3個屬性所代表的意思是什麼
翻了書跟網路上找些資料都看的一知半解
您好:
刪除先給你看一下官方文件:
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來做調整。
剩下的如果看不懂可以試著實作實驗看看。
如果以2D空間的動態我大概可以理解
刪除但如果是遇到transform.rotation.x/y/z這種翻轉的概念
我就不太懂值該如何設置及計算toValue才能是我想要的效果
感覺只能一個一個值慢慢測
您好:
刪除xyz指的就是 上下、左右與前後(深度)
只是我也不知道您到底想問什麼!?
我當初想問的問題是假設我的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];
來達到效果
非常感謝牛奶大的例子^^
您好:
刪除不客氣唷!!