iOS Core Animation (二) 關鍵幀動畫

關鍵幀動畫是在動畫控制過程中開發者指定主要的動畫狀態,至于各個狀態間動畫如何進行則由系統自動運算補充(每兩個關鍵幀之間系統形成的動畫稱為“補間動畫”),這種動畫的好處就是開發者不用逐個控制每個動畫幀,而只要關心幾個關鍵幀的狀態即可。
?關鍵幀動畫開發分為兩種形式:一種是通過設置不同的屬性值進行關鍵幀控制,另一種是通過繪制路徑進行關鍵幀控制。后者優先級高于前者,如果設置了路徑則屬性值就不再起作用。
?我們可以通過關鍵幀動畫的values屬性控制動畫的軌跡。假設我們的動畫軌跡是s型的,我們添加幾個關鍵幀就好了,具體如下

#import "ViewController.h"
#import <QuartzCore/QuartzCore.h>

@interface ViewController () <CAAnimationDelegate>

@property (nonatomic, strong) CALayer *animationCALayer;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    self.animationCALayer = [[CALayer alloc] init];
    self.animationCALayer.bounds = CGRectMake(0, 0, 40, 40);
    self.animationCALayer.position = CGPointMake(50, 150);
    self.animationCALayer.contents = (id)[UIImage imageNamed:@"vehicleResource.png"].CGImage;

    [self.view.layer addSublayer:self.animationCALayer];
    
    [self translationAnimation];
}

#pragma mark - 關鍵幀動畫
- (void) translationAnimation {
    // 1、創建關鍵幀動畫并設置動畫屬性
    CAKeyframeAnimation *keyframeAnimation=[CAKeyframeAnimation animationWithKeyPath:@"position"];
    
    // 2、設置關鍵幀,這里有四個關鍵幀
    NSValue *key1 = [NSValue valueWithCGPoint:self.animationCALayer.position]; //對于關鍵幀動畫初始值不能省略
    NSValue *key2 = [NSValue valueWithCGPoint:CGPointMake(160, 200)];
    NSValue *key3 = [NSValue valueWithCGPoint:CGPointMake(45, 300)];
    NSValue *key4 = [NSValue valueWithCGPoint:CGPointMake(200, 400)];
    NSArray *values = @[key1, key2, key3, key4];
    keyframeAnimation.values = values;
    //設置其他屬性
    keyframeAnimation.duration = 4.0;
    
    keyframeAnimation.beginTime = CACurrentMediaTime() + 2;//設置延遲2秒執行
    
    // 4、添加動畫到圖層,添加動畫后就會執行動畫
    [self.animationCALayer addAnimation:keyframeAnimation forKey:@"KCKeyframeAnimation_Position"];
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
}

@end
動態圖1.gif

?如果我們想要的路徑是曲線而不是折線,我們可以通過描繪路徑進行關鍵幀動畫控制。

#pragma mark - 關鍵幀動畫
- (void) translationAnimation {
    
    // 1、創建關鍵幀動畫并設置動畫屬性
    CAKeyframeAnimation *keyframeAnimation = [CAKeyframeAnimation animationWithKeyPath:@"position"];
    
    // 2、設置路徑
    // 繪制貝塞爾曲線
    CGMutablePathRef path = CGPathCreateMutable();
    CGPathMoveToPoint(path, NULL, self.animationCALayer.position.x, self.animationCALayer.position.y); // 移動到起始點
    CGPathAddCurveToPoint(path, NULL, -50.0, 200.0, 150.0, 300.0,100.0, 500.0); // 繪制二次貝塞爾曲線

    keyframeAnimation.path = path; // 設置path屬性
    CGPathRelease(path); // 釋放路徑對象
    // 設置其他屬性
    keyframeAnimation.duration = 6.0;
    keyframeAnimation.beginTime = CACurrentMediaTime() + 10; // 設置延遲2秒執行
    
    // 3、添加動畫到圖層,添加動畫后就會執行動畫
    [self.animationCALayer addAnimation:keyframeAnimation forKey:@"KCKeyframeAnimation_Position"];
}
動態圖2.gif
其他屬性

keyTimes:各個關鍵幀的時間控制。前面使用values設置了四個關鍵幀,默認情況下每兩幀之間的間隔為:4/(4-1)秒。如果想要控制動畫從第一幀到第二針占用時間2秒,從第二幀到第三幀時間為1秒,而從第三幀到第四幀時間1秒的話,就可以通過keyTimes進行設置。keyTimes中存儲的是時間占用比例點,此時可以設置keyTimes的值為0.0,0.5,0.75,1.0(當然必須轉換為NSNumber),也就是說1到2幀運行到總時間的50%,2到3幀運行到總時間的75%,3到4幀運行到4秒結束。
caculationMode:動畫計算模式。還拿上面keyValues動畫舉例,之所以1到2幀能形成連貫性動畫而不是直接從第1幀經過8/3秒到第2幀是因為動畫模式是連續的(值為kCAAnimationLinear,這是計算模式的默認值);而如果指定了動畫模式為kCAAnimationDiscrete離散的那么你會看到動畫從第1幀經過8/3秒直接到第2幀,中間沒有任何過渡。其他動畫模式還有:kCAAnimationPaced(均勻執行,會忽略keyTimes)、kCAAnimationCubic(平滑執行,對于位置變動關鍵幀動畫運行軌跡更平滑)、kCAAnimationCubicPaced(平滑均勻執行)。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,533評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,055評論 3 414
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,365評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,561評論 1 307
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,346評論 6 404
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,889評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 42,978評論 3 439
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,118評論 0 286
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,637評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,558評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,739評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,246評論 5 355
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 43,980評論 3 346
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,362評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,619評論 1 280
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,347評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,702評論 2 370

推薦閱讀更多精彩內容