iOS開發之動畫中的時間(概況),ios概況
一、引言
在iOS開發中使用動畫時,可以通過設定動畫的duration
、speed
、begintime
、offset
屬性,來設定動畫的時間長度、速度、起始時間及起始位移。
用一個簡單的例子來說明各個參數的的作用。動畫很簡單,一個紅色的方塊從左移到右邊。動畫的期間是1s,沒有重複,效果如下。
CFTimeInterval currentTime = CACurrentMediaTime(); CFTimeInterval currentTimeInLayer = [self.testLayer convertTime:currentTime fromLayer:nil]; CFTimeInterval addTime = currentTimeInLayer; anim.beginTime = 0.3 + addTime; [anim setTimeOffset:0.5]; [anim setSpeed:2];
做修改以後,效果如下:
二、層級時間結構
根據文檔,CMediaTiming
協議構建了一個層級的時間系統,並用這個層級的時間系統來協調各個layer、animation的時間。
這個協議被CAAnimation
及CALayer
遵守,每一個遵守協議的的object對應一個time space
。根據object之間的關係,不同的time space
有層級關係。比如Layer A有一個subLayer B,那麼Layer A對應的time space
就是layer B對應的time space
的parent time space
。每一個time space
中時間的數值都是根據parent time space
的數值,以及begintime
、speed
等屬性,根據一定的規則來計算的。
為了便於理解層級時間系統,先看下layer在螢幕上的顯示位置是如何確定的,然後做一個類比。
layer層級如上。要確定sublayer1在螢幕上的顯示位置,一共分三步。
與此類似,要確定sub1ayer1中的time,也要分三步。
和確定layer的位置相比,確定時間有一些複雜,主要提現在下面兩點
三、
active local time
這次轉換是為了處理當前層級的object在父層級的的時間軸上的位置,以及當前層級和父層級之間時間流逝速度的關係。
和這次轉換相關的屬性有beginTime
、speed
以及timeOffset
從parent time
到active local time
有一個公式,可以用來參考。
t = (tp - begin) * speed + offset
四、
basic local time
這次轉換是為了處理當前層級的重放(repeat)、以及重放之前是否要倒放(play backward)等操作。
比如當前層級是一個動畫(CAAnimation
遵守CAMediaTiming
協議),duration
是1s,經過第一次轉換之後的active local time
是5.5s。如果動畫的repeatCount
是10,那麼經過第二次轉化以後,basic local time
會是0.5s,因此當前是動畫展示一半的狀態。
五、文首的例子
根據這些知識,可以解釋文章開始時設定參數的效果。
當動畫被加到layer上時,動畫對應的time space
被加到層級時間系統中,是layer對應的time space
的子層級。
六、更多應用
瞭解了CAMediaTiming
協議後,可以實現很多動畫的效果。
蘋果已經把工具給我們了,可以做出什麼樣的產品就看大家的想象力了。
參考
控制動畫時間
控制動畫時間(上文的中文版)
Time Warp in Animation