iOS動(dòng)畫基礎(chǔ)

導(dǎo)語

這段時(shí)間我們部門組織學(xué)習(xí)分享Core Animation电湘,所以我就稍微整理了下關(guān)于動(dòng)畫這塊的分享次企。

Core Animation其實(shí)是一個(gè)令人誤解的命名迹辐,大多數(shù)人認(rèn)為它只是用來做動(dòng)畫的溺蕉,但實(shí)際上市一個(gè)叫做Layer Kit演變而來某宪,所以動(dòng)畫只是Core Animation特性的冰山一角而已福压,接下來我們就討論下這個(gè)冰山一角的常規(guī)用法掏秩,純粹是拋磚引玉。

一荆姆、基礎(chǔ)知識

1蒙幻、動(dòng)畫的本質(zhì)
  • 一定時(shí)間內(nèi)屬性值的變化,屬性為位置胆筒、透明度邮破、旋轉(zhuǎn)等
2、動(dòng)畫實(shí)現(xiàn)方式
  • 逐幀:需要處理動(dòng)畫的每一幀,這樣的實(shí)現(xiàn)動(dòng)畫的方式叫做逐幀動(dòng)畫
  • 關(guān)鍵幀:我們只需給定幾個(gè)關(guān)鍵幀的畫面抒和,其余過度幀都由計(jì)算機(jī)自動(dòng)生成

二队询、動(dòng)畫實(shí)現(xiàn)

關(guān)鍵幀動(dòng)畫
1、CABasicAnimation

1构诚、動(dòng)畫的屬性


1485148932685541.png

2蚌斩、屬性值的解釋

  • repeatCount:一直不斷重復(fù):swift:Float.infinity,OC:HUGE_VALF
  • timingFunction:
    kCAMediaTimingFunctionLinear:勻速改變
    kCAMediaTimingFunctionEaseIn:漸入
    kCAMediaTimingFunctionEaseOut: 漸出
    kCAMediaTimingFunctionEaseInEaseOut:漸入漸出
    kCAMediaTimingFunctionDefault:隱式動(dòng)畫更加適合
使用方法
    pathAnim.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
  • fillMode
    kCAFillModeForwards:動(dòng)畫開始之后layer的狀態(tài)將保持在動(dòng)畫的最后一幀范嘱,而removedOnCompletion的默認(rèn)屬性值是 YES送膳,所以為了使動(dòng)畫結(jié)束之后layer保持結(jié)束狀態(tài),應(yīng)將removedOnCompletion設(shè)置為NO丑蛤。
    kCAFillModeBackwards:將會立即執(zhí)行動(dòng)畫的第一幀叠聋,不論是否設(shè)置了 beginTime屬性。觀察發(fā)現(xiàn)受裹,設(shè)置該值碌补,剛開始視圖不見,還不知道應(yīng)用在哪里棉饶。
    kCAFillModeBoth:該值是 kCAFillModeForwards 和kCAFillModeBackwards的組合狀態(tài)
    kCAFillModeRemoved:動(dòng)畫將在設(shè)置的 beginTime 開始執(zhí)行(如沒有設(shè)置beginTime屬性厦章,則動(dòng)畫立即執(zhí)行),動(dòng)畫執(zhí)行完成后將會layer的改變恢復(fù)原狀照藻。
示例
  • 旋轉(zhuǎn)動(dòng)畫
旋轉(zhuǎn)動(dòng)畫.gif
  • 位移動(dòng)畫


    位移動(dòng)畫.gif
  • 背景顏色變化動(dòng)畫辞嗡、背景圖片變化動(dòng)畫纽乱、圓角變化動(dòng)畫
背景顏色變化動(dòng)畫.gif
  • 比例縮放動(dòng)畫
1485149752466446.gif
  • size大小縮放催什、透明值變化動(dòng)畫(可用作閃爍效果)
size大小縮放凤覆、透明值變化動(dòng)畫.gif
2、CAKeyframeAnimation

CAKeyframeAnimation是核心動(dòng)畫里面的幀動(dòng)畫,它提供了按照指定的一串值進(jìn)行動(dòng)畫,好像拍電影一樣的一幀一幀的效果

 UIView *tempView = [[UIView alloc] initWithFrame:CGRectMake(50, 100, 250, 250)];
    
    UIBezierPath *bezierPath = [UIBezierPath bezierPathWithOvalInRect:tempView.frame];
    UIView *animView = [[UIView alloc] initWithFrame:CGRectMake(50, 50, 70, 80)];
    animView.backgroundColor = [UIColor redColor];
    [self.view addSubview:animView];
    
    CAKeyframeAnimation *orbitAnim = [CAKeyframeAnimation animationWithKeyPath:@"position"];
    orbitAnim.duration = 5;
    orbitAnim.path = bezierPath.CGPath;
    orbitAnim.calculationMode = kCAAnimationPaced;
    orbitAnim.fillMode = kCAFillModeForwards;
    orbitAnim.repeatCount = INFINITY;
    orbitAnim.rotationMode = kCAAnimationRotateAutoReverse;
    [animView.layer addAnimation:orbitAnim forKey:@"orbitAnim"];
    
    CAShapeLayer *shapeLayer = [[CAShapeLayer alloc] init];
    shapeLayer.strokeColor = [UIColor purpleColor].CGColor;
    shapeLayer.fillColor = [UIColor clearColor].CGColor;
    shapeLayer.lineWidth = 0.5;
    shapeLayer.lineJoin = kCALineJoinRound;
    shapeLayer.lineCap = kCALineCapRound;
    shapeLayer.path = bezierPath.CGPath;
    [self.view.layer addSublayer:shapeLayer];
  • 示例
CAKeyframeAnimation路徑動(dòng)畫.gif
3发乔、CATransition

主要用于轉(zhuǎn)場動(dòng)畫從一個(gè)場景以動(dòng)畫的形式過渡到另一個(gè)場景

另外還有一些系統(tǒng)未公開的動(dòng)畫效果:

["cube", "suckEffect", "rippleEffect", "pageCurl", "pageUnCurl", "oglFlip", "cameraIrisHollowOpen", "cameraIrisHollowClose", "spewEffect","genieEffect","unGenieEffect","twist","tubey","swirl","charminUltra", "zoomyIn", "zoomyOut", "oglApplicationSuspend"]

代碼示例:

CATransition *pageCurlAnim = [[CATransition alloc] init];
    pageCurlAnim.delegate = self;
    pageCurlAnim.duration = 1.0;
    pageCurlAnim.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseOut];
    pageCurlAnim.type = animArr[index];
    pageCurlAnim.subtype = kCATransitionFromLeft;
    pageCurlAnim.repeatCount = 1;
    [pageCurlAnim setValue:@"transitionAnim" forKey:@"anim"];
    [transitionLab.layer addAnimation:pageCurlAnim forKey:@"transition"];
4熟妓、CASpringAnimation

iOS9才引入的動(dòng)畫類,在以前我們都是使用facebook的pop來做這種彈簧效果栏尚,它繼承于CABaseAnimation起愈,用于制作彈簧動(dòng)畫

參數(shù)說明
  • mass:質(zhì)量,影響圖層運(yùn)動(dòng)時(shí)的彈簧慣性抵栈,質(zhì)量越大告材,彈簧拉伸和壓縮的幅度越大,動(dòng)畫的速度變慢古劲,并且波動(dòng)幅度變大
  • stiffness:剛度系數(shù)(勁度系數(shù)/彈性系數(shù))斥赋,剛度系數(shù)越大,形變產(chǎn)生的力就越大产艾,運(yùn)動(dòng)越快
  • damping:阻尼系數(shù)疤剑,阻止彈簧伸縮的系數(shù)滑绒,阻尼系數(shù)越大,停止越快
  • initialVelocity:初始速率隘膘,動(dòng)畫視圖的初始速度大小速率為正數(shù)時(shí)疑故,速度方向與運(yùn)動(dòng)方向一致,速率為負(fù)數(shù)時(shí)弯菊,速度方向與運(yùn)動(dòng)方向相反如果
  • settlingDuration:結(jié)算時(shí)間 返回彈簧動(dòng)畫到停止時(shí)的估算時(shí)間纵势,根據(jù)當(dāng)前的動(dòng)畫參數(shù)估算通常彈簧動(dòng)畫的時(shí)間使用結(jié)算時(shí)間比較準(zhǔn)確
  • 示例


    彈簧.gif
逐幀動(dòng)畫

實(shí)際就是周期性的(CADisplayLink)對UIView背后的CALayer的修改
著名的facebook的pop動(dòng)畫框架,就是使用CADisplayLink這種逐幀繪制的方式管钳。

三钦铁、關(guān)鍵幀與逐幀對比

  • 關(guān)鍵幀:只需要修改某個(gè)屬性值,簡單方便才漆,但涉及深層次內(nèi)容較多牛曹,需要更多的理解和聯(lián)系。
  • 逐幀:實(shí)現(xiàn)原理簡單醇滥,但繪制動(dòng)畫的過程復(fù)雜黎比,處理的事情多開銷大,繪制過程中需要數(shù)學(xué)鸳玩、物理學(xué)知識計(jì)算中間量阅虫。

四、一些有意思的動(dòng)畫

  • 曲線劃線動(dòng)畫


    曲線劃線動(dòng)畫.gif
  • 利用正弦曲線做的怀喉,也是逐幀動(dòng)畫书妻,相信很多人都做過:

正弦曲線.gif
  • 粒子動(dòng)畫
粒子動(dòng)畫.gif

最后附 demohttps://github.com/yangbin911213/YBAnimation

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末船响,一起剝皮案震驚了整個(gè)濱河市躬拢,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌见间,老刑警劉巖聊闯,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異米诉,居然都是意外死亡菱蔬,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進(jìn)店門史侣,熙熙樓的掌柜王于貴愁眉苦臉地迎上來拴泌,“玉大人,你說我怎么就攤上這事惊橱◎礁” “怎么了?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵税朴,是天一觀的道長回季。 經(jīng)常有香客問我家制,道長,這世上最難降的妖魔是什么泡一? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任颤殴,我火速辦了婚禮,結(jié)果婚禮上鼻忠,老公的妹妹穿的比我還像新娘涵但。我一直安慰自己,他們只是感情好帖蔓,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布贤笆。 她就那樣靜靜地躺著,像睡著了一般讨阻。 火紅的嫁衣襯著肌膚如雪芥永。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天钝吮,我揣著相機(jī)與錄音埋涧,去河邊找鬼。 笑死奇瘦,一個(gè)胖子當(dāng)著我的面吹牛棘催,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播耳标,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼醇坝,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了次坡?” 一聲冷哼從身側(cè)響起呼猪,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎砸琅,沒想到半個(gè)月后宋距,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡症脂,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年谚赎,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片诱篷。...
    茶點(diǎn)故事閱讀 39,690評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡壶唤,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出棕所,到底是詐尸還是另有隱情闸盔,我是刑警寧澤,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布橙凳,位于F島的核電站蕾殴,受9級特大地震影響笑撞,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜钓觉,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一茴肥、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧荡灾,春花似錦瓤狐、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至荧缘,卻和暖如春皆警,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背截粗。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工信姓, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人绸罗。 一個(gè)月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓意推,卻偏偏與公主長得像,于是被迫代替她去往敵國和親珊蟀。 傳聞我的和親對象是個(gè)殘疾皇子菊值,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評論 2 353

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