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