iOS核心動(dòng)畫高級(jí)技巧(筆記)——(八)圖層時(shí)間、緩沖

圖層時(shí)間

CAMediaTiming協(xié)議

  • CAMediaTiming協(xié)議定義了在一段動(dòng)畫內(nèi)用來(lái)控制逝去時(shí)間的屬性的集合,CALayerCAAnimation都實(shí)現(xiàn)了這個(gè)協(xié)議。
  • 持續(xù)和重復(fù)

durationrepeatCount默認(rèn)都是0。但這不意味著動(dòng)畫時(shí)長(zhǎng)為0秒,或者0次,這里的0僅僅代表了“默認(rèn)”,也就是0.25秒和1次。
創(chuàng)建重復(fù)動(dòng)畫的另一種方式是使用repeatDuration屬性,它讓動(dòng)畫重復(fù)一個(gè)指定的時(shí)間,而不是指定次數(shù)。還可以設(shè)置一個(gè)叫做autoreverses的屬性(BOOL類型),可以在動(dòng)畫結(jié)束后執(zhí)行逆動(dòng)畫。

  • 相對(duì)時(shí)間

beginTime指定了動(dòng)畫開始之前的的延遲時(shí)間。這里的延遲從動(dòng)畫添加到可見(jiàn)圖層的那一刻開始測(cè)量,默認(rèn)是0(就是說(shuō)動(dòng)畫會(huì)立刻執(zhí)行)。
speed是一個(gè)時(shí)間的倍數(shù),默認(rèn)1.0,減少它會(huì)減慢圖層/動(dòng)畫的時(shí)間,增加它會(huì)加快速度。如果2.0的速度,那么對(duì)于一個(gè)duration為1的動(dòng)畫,實(shí)際上在0.5秒的時(shí)候就已經(jīng)完成了。
timeOffsetbeginTime類似,但是和增加beginTime導(dǎo)致的延遲動(dòng)畫不同,增加timeOffset只是讓動(dòng)畫快進(jìn)到某一點(diǎn),例如,對(duì)于一個(gè)持續(xù)1秒的動(dòng)畫來(lái)說(shuō),設(shè)置timeOffset為0.5意味著動(dòng)畫將從一半的地方開始。

  • fillMode

設(shè)置fillMode時(shí)需要把removeOnCompletion設(shè)置為NO。

層級(jí)關(guān)系時(shí)間

  • 對(duì)CALayer或者CAGroupAnimation調(diào)整durationrepeatCount/repeatDuration屬性并不會(huì)影響到子動(dòng)畫。但是beginTime,timeOffsetspeed屬性將會(huì)影響到子動(dòng)畫。
  • 全局時(shí)間和本地時(shí)間

  • CoreAnimation有一個(gè)全局時(shí)間的概念,也就是所謂的馬赫時(shí)間。馬赫時(shí)間在設(shè)備上所有進(jìn)程都是全局的,但是在不同設(shè)備上并不是全局的??梢允褂?code>CACurrentMediaTime函數(shù)來(lái)訪問(wèn)馬赫時(shí)間:
    CFTimeInterval time = CACurrentMediaTime()
    這個(gè)函數(shù)返回的值其實(shí)無(wú)關(guān)緊要(它返回了設(shè)備自從上次啟動(dòng)后的秒數(shù),并不是你所關(guān)心的),它真實(shí)的作用在于對(duì)動(dòng)畫的時(shí)間測(cè)量提供了一個(gè)相對(duì)值。
  • 每個(gè)CALayerCAAnimation實(shí)例都有自己本地時(shí)間的概念,是根據(jù)父圖層/動(dòng)畫層級(jí)關(guān)系中的beginTimetimeOffsetspeed屬性計(jì)算。就和轉(zhuǎn)換不同圖層之間坐標(biāo)關(guān)系一樣,CALayer同樣也提供了方法來(lái)轉(zhuǎn)換不同圖層之間的本地時(shí)間。如下:
    - (CFTimeInterval)convertTime:(CFTimeInterval)t fromLayer:(CALayer *)l
    - (CFTimeInterval)convertTime:(CFTimeInterval)t toLayer:(CALayer *)l

手動(dòng)動(dòng)畫

  • timeOffset一個(gè)很有用的功能在于你可以它可以讓你手動(dòng)控制動(dòng)畫進(jìn)程,通過(guò)設(shè)置speed為0,可以禁用動(dòng)畫的自動(dòng)播放,然后來(lái)使用timeOffset來(lái)來(lái)回顯示動(dòng)畫序列。這可以使得運(yùn)用手勢(shì)來(lái)手動(dòng)控制動(dòng)畫變得很簡(jiǎn)單。

緩沖

動(dòng)畫速度

  • 改變動(dòng)畫速度首先需要設(shè)置CAAnimationtimingFunction屬性,是CAMediaTimingFunction類的一個(gè)對(duì)象。如果想改變隱式動(dòng)畫的計(jì)時(shí)函數(shù),同樣也可以使用CATransaction+setAnimationTimingFunction:方法。有一些方式來(lái)創(chuàng)建CAMediaTimingFunction,最簡(jiǎn)單的方式是調(diào)用+timingFunctionWithName:的構(gòu)造方法。這里傳入如下幾個(gè)常量之一:
    kCAMediaTimingFunctionLinear
    kCAMediaTimingFunctionEaseIn
    kCAMediaTimingFunctionEaseOut
    kCAMediaTimingFunctionEaseInEaseOut
    kCAMediaTimingFunctionDefault
    kCAMediaTimingFunctionLinear創(chuàng)建了一個(gè)線性的計(jì)時(shí)函數(shù),同樣也是CAAnimationtimingFunction屬性為空時(shí)候的默認(rèn)函數(shù)。
    kCAMediaTimingFunctionEaseIn常量創(chuàng)建了一個(gè)慢慢加速然后突然停止的方法。
    kCAMediaTimingFunctionEaseOut則恰恰相反,它以一個(gè)全速開始,然后慢慢減速停止。
    kCAMediaTimingFunctionEaseInEaseOut創(chuàng)建了一個(gè)慢慢加速然后再慢慢減速的過(guò)程。
    最后還有一個(gè)kCAMediaTimingFunctionDefault,它和kCAMediaTimingFunctionEaseInEaseOut很類似,但是加速和減速的過(guò)程都稍微有些慢。雖然它的名字說(shuō)是默認(rèn)的,但還是要記住當(dāng)創(chuàng)建顯式的CAAnimation它并不是默認(rèn)選項(xiàng)(換句話說(shuō),默認(rèn)的圖層行為動(dòng)畫用kCAMediaTimingFunctionDefault作為它們的計(jì)時(shí)方法)。
  • 緩沖和關(guān)鍵幀動(dòng)畫

CAKeyframeAnimation有一個(gè)NSArray類型的timingFunctions屬性,我們可以用它來(lái)對(duì)每次動(dòng)畫的步驟指定不同的計(jì)時(shí)函數(shù)。但是指定函數(shù)的個(gè)數(shù)一定要等于values數(shù)組的元素個(gè)數(shù)減一,因?yàn)樗敲枋雒恳粠g動(dòng)畫速度的函數(shù)。
let animation = CAKeyframeAnimation()
animation.keyPath = "backgroundColor"
animation.values = [UIColor.redColor().CGColor,UIColor.greenColor().CGColor,UIColor.blueColor().CGColor,UIColor.redColor().CGColor]
animation.duration = 4.0
let fn = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseIn)
animation.timingFunctions = [fn,fn,fn]
self.colorLayer.addAnimation(animation, forKey: nil)

自定義緩沖函數(shù)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 在上面兩章中,我們探討了可以用 CAAnimation和它的子類實(shí)現(xiàn)的多種圖層動(dòng)畫。動(dòng)畫的發(fā)生是需要持續(xù)一段時(shí)間的...
    努力奔跑的小男孩閱讀 932評(píng)論 0 1
  • Core Animation Core Animation,中文翻譯為核心動(dòng)畫,它是一組非常強(qiáng)大的動(dòng)畫處理API,...
    45b645c5912e閱讀 3,158評(píng)論 0 21
  • 書寫的很好,翻譯的也棒!感謝譯者,感謝感謝! iOS-Core-Animation-Advanced-Techni...
    錢噓噓閱讀 2,440評(píng)論 0 6
  • 在iOS中隨處都可以看到絢麗的動(dòng)畫效果,實(shí)現(xiàn)這些動(dòng)畫的過(guò)程并不復(fù)雜,今天將帶大家一窺ios動(dòng)畫全貌。在這里你可以看...
    每天刷兩次牙閱讀 8,694評(píng)論 6 30
  • 聽(tīng)從黎明聲聲起,何時(shí)到我漁船處。停船默聽(tīng)風(fēng)吹柳,且看九州處處是悲流!暫聽(tīng)天下志士談?wù)撋琊⒁唤y(tǒng),憶九州世態(tài)炎涼過(guò)往。...
    十三月下夕樓閱讀 195評(píng)論 0 0

友情鏈接更多精彩內(nèi)容