CAKeyFrameAnimation繪制沿軌跡移動核心動畫

KeyFrameAnimation來源于動畫產(chǎn)業(yè),最早做動畫片的時候,會分為幾個角色像吻,牛點(diǎn)的人會根據(jù)劇情等因素把場景中的關(guān)鍵畫面畫出來峻黍,剩下的不那么牛的人則根據(jù)這些關(guān)鍵畫面把一些過渡性的圖片補(bǔ)足,假設(shè)一秒需要20張圖片拨匆,關(guān)鍵圖片可能有5張姆涩,剩下的15張則根據(jù)這5張的內(nèi)容來補(bǔ)齊,這就是最早的key frame的來源惭每。其實(shí)在視頻編解碼中也經(jīng)常會碰到類似的屬于阵面,比如KeyFrame和I幀P幀這些名詞,都是跟這些有關(guān)的洪鸭。

在iOS中,如果你使用CAKeyFrameAnimation仑扑,則需要提供一些關(guān)鍵點(diǎn)览爵,然后iOS在顯示的過程中會根據(jù)這些信息自動補(bǔ)齊過渡性的內(nèi)容。

我們可以用下面一個飛機(jī)飛行線路的例子來說明

- (void)drawSpaceCurve
{
    // Create a path
    UIBezierPath *bezierPath = [[UIBezierPath alloc] init];
    [bezierPath moveToPoint:CGPointMake(0, 150)];
    [bezierPath addCurveToPoint:CGPointMake(300, 150)
                  controlPoint1:CGPointMake(75, 0)
                  controlPoint2:CGPointMake(225, 300)];

    // Draw the path using CAShapeLayer
    CAShapeLayer *pathLayer = [CAShapeLayer layer];
    pathLayer.path = bezierPath.CGPath;
    pathLayer.fillColor = [UIColor clearColor].CGColor;
    pathLayer.strokeColor = [UIColor redColor].CGColor;
    pathLayer.lineWidth = 3.0f;
    [self.view.layer addSublayer:pathLayer];

    // Add the ship
    CALayer *shipLayer = [CALayer layer];
    shipLayer.frame = CGRectMake(0, 0, 64, 64);
    shipLayer.position = CGPointMake(0, 150);
    shipLayer.contents = (__bridge id)[UIImage imageNamed:@"Ship"].CGImage;
    [self.view.layer addSublayer:shipLayer];

    // Create the keyframe animation
    CAKeyframeAnimation *animation = [CAKeyframeAnimation animation];
    animation.keyPath = @"position";
    animation.duration = 4.0f;
    animation.path = bezierPath.CGPath;
    [shipLayer addAnimation:animation forKey:nil];
}
軌跡動畫1.png

在代碼運(yùn)行中镇饮,我們確實(shí)看到了飛機(jī)的運(yùn)行軌跡和我們定義的bezierPath一致蜓竹,但有個問題,就是飛機(jī)的機(jī)頭方向沒有在運(yùn)行過程中做調(diào)整储藐,這便使動畫看起來怪怪的俱济,不過好在Apple已經(jīng)預(yù)見到這個需求,所以在CAKeyFrameAnimation中提供了一個名為rotationMode的屬性钙勃,當(dāng)我們把這個屬性設(shè)置為kCAAnimationRotateAuto時蛛碌,飛機(jī)在運(yùn)行過程中機(jī)頭始終超前,實(shí)現(xiàn)了我們的需求辖源。

animation.rotationMode = kCAAnimationRotateAuto;

另外在實(shí)際的動畫應(yīng)用中蔚携,我們經(jīng)常會使用到多個動畫效果一同展示的情況,這種情況我們可以通過CAAnimationGroup來實(shí)現(xiàn)克饶,它的用法和單獨(dú)設(shè)置一個動畫的效果沒有太大的區(qū)別酝蜒,但當(dāng)你把多種效果組合到一起,在展示的時候矾湃,就可以輕松完成多個效果的同時展示亡脑。

我們還是用上面的軌跡來演示,不過把飛機(jī)換成了一個色塊邀跃,動畫是使色塊不但按照我們規(guī)定好的路徑運(yùn)動霉咨,并且在運(yùn)動中進(jìn)行顏色的變換。

- (void)testAnimationGroup
{
    UIBezierPath *bezierPath = [[UIBezierPath alloc] init];
    [bezierPath moveToPoint:CGPointMake(0, 150)];
    [bezierPath addCurveToPoint:CGPointMake(300, 150)
                  controlPoint1:CGPointMake(75, 0)
                  controlPoint2:CGPointMake(225, 300)];

    CAShapeLayer *pathLayer = [CAShapeLayer layer];
    pathLayer.path = bezierPath.CGPath;
    pathLayer.fillColor = [UIColor clearColor].CGColor;
    pathLayer.strokeColor = [UIColor redColor].CGColor;
    pathLayer.lineWidth = 3.0f;
    [self.view.layer addSublayer:pathLayer];

    CALayer *colorLayer = [CALayer layer];
    colorLayer.frame = CGRectMake(0, 0, 64, 64);
    colorLayer.position = CGPointMake(0, 150);
    colorLayer.backgroundColor = [UIColor greenColor].CGColor;
    [self.view.layer addSublayer:colorLayer];

    CAKeyframeAnimation *animation1 = [CAKeyframeAnimation animation];
    animation1.keyPath = @"position";
    animation1.path = bezierPath.CGPath;
    animation1.rotationMode = kCAAnimationRotateAuto;

    CABasicAnimation *animation2 = [CABasicAnimation animation];
    animation2.keyPath = @"backgroundColor";
    animation2.toValue = (__bridge id)[UIColor redColor].CGColor;

    CAAnimationGroup *group = [CAAnimationGroup animation];
    group.animations = @[animation1, animation2];
    group.duration = 4.0f;

    [colorLayer addAnimation:group forKey:nil];
}
軌跡動畫2.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末坞嘀,一起剝皮案震驚了整個濱河市躯护,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌丽涩,老刑警劉巖棺滞,帶你破解...
    沈念sama閱讀 206,482評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件裁蚁,死亡現(xiàn)場離奇詭異,居然都是意外死亡继准,警方通過查閱死者的電腦和手機(jī)枉证,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來移必,“玉大人室谚,你說我怎么就攤上這事〈薇茫” “怎么了秒赤?”我有些...
    開封第一講書人閱讀 152,762評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長憎瘸。 經(jīng)常有香客問我入篮,道長,這世上最難降的妖魔是什么幌甘? 我笑而不...
    開封第一講書人閱讀 55,273評論 1 279
  • 正文 為了忘掉前任潮售,我火速辦了婚禮,結(jié)果婚禮上锅风,老公的妹妹穿的比我還像新娘酥诽。我一直安慰自己,他們只是感情好皱埠,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,289評論 5 373
  • 文/花漫 我一把揭開白布肮帐。 她就那樣靜靜地躺著,像睡著了一般边器。 火紅的嫁衣襯著肌膚如雪泪姨。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,046評論 1 285
  • 那天饰抒,我揣著相機(jī)與錄音肮砾,去河邊找鬼。 笑死袋坑,一個胖子當(dāng)著我的面吹牛仗处,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播枣宫,決...
    沈念sama閱讀 38,351評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼婆誓,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了也颤?” 一聲冷哼從身側(cè)響起洋幻,我...
    開封第一講書人閱讀 36,988評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎翅娶,沒想到半個月后文留,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體好唯,經(jīng)...
    沈念sama閱讀 43,476評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,948評論 2 324
  • 正文 我和宋清朗相戀三年燥翅,在試婚紗的時候發(fā)現(xiàn)自己被綠了骑篙。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,064評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡森书,死狀恐怖靶端,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情凛膏,我是刑警寧澤杨名,帶...
    沈念sama閱讀 33,712評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站猖毫,受9級特大地震影響镣煮,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜鄙麦,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,261評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望镊折。 院中可真熱鬧胯府,春花似錦、人聲如沸恨胚。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽赃泡。三九已至寒波,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間升熊,已是汗流浹背俄烁。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留级野,地道東北人页屠。 一個月前我還...
    沈念sama閱讀 45,511評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像蓖柔,于是被迫代替她去往敵國和親辰企。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,802評論 2 345

推薦閱讀更多精彩內(nèi)容

  • 在iOS中隨處都可以看到絢麗的動畫效果,實(shí)現(xiàn)這些動畫的過程并不復(fù)雜,今天將帶大家一窺ios動畫全貌伶唯。在這里你可以看...
    每天刷兩次牙閱讀 8,465評論 6 30
  • 在iOS中隨處都可以看到絢麗的動畫效果舌涨,實(shí)現(xiàn)這些動畫的過程并不復(fù)雜,今天將帶大家一窺iOS動畫全貌羞延。在這里你可以看...
    F麥子閱讀 5,094評論 5 13
  • 顯式動畫 顯式動畫拷淘,它能夠?qū)σ恍傩宰鲋付ǖ淖远x動畫嵌牺,或者創(chuàng)建非線性動畫帮辟,比如沿著任意一條曲線移動速址。 屬性動畫 ...
    清風(fēng)沐沐閱讀 1,921評論 1 5
  • 在iOS實(shí)際開發(fā)中常用的動畫無非是以下四種:UIView動畫,核心動畫由驹,幀動畫芍锚,自定義轉(zhuǎn)場動畫。 1.UIView...
    請叫我周小帥閱讀 3,078評論 1 23
  • 上一章介紹了隱式動畫的概念蔓榄。隱式動畫是在iOS平臺創(chuàng)建動態(tài)用戶界面的一種直接方式并炮,也是UIKit動畫機(jī)制的基礎(chǔ),不...
    努力奔跑的小男孩閱讀 1,027評論 0 1