[iOS 動畫]實現(xiàn)一個Material Design風(fēng)格的Loading

難度:??
最終效果:

最終效果
最終效果

平時在逛一些設(shè)計相關(guān)網(wǎng)站時總想把一些效果實現(xiàn)一下,這次挑了 Google Material Design的練一下手。

我們可以把動畫簡單地分解為 路徑填充 + 旋轉(zhuǎn):

沒有旋轉(zhuǎn)的情況下
沒有旋轉(zhuǎn)的情況下

仔細考慮一番,可以發(fā)現(xiàn)用改變 CAShapeLayer 的 strokeStart 和 strokeEnd 實現(xiàn)。整個填充看起來像 strokeEnd跑的快, strokeStart開始跑得慢,但在 strokeEnd跑到終點后突然加速追趕。
但似乎時間函數(shù)沒那么好控制,因為它顯得不那么規(guī)律。在這種情況下,我們可以使用關(guān)鍵幀動畫實現(xiàn)這種不規(guī)則的時間函數(shù)控制。我簡單地把它分為了三個時間點: 0,0.5,1.0。
時間點 0:strokeEnd出發(fā)了一點點,但 strokeEnd還沒動。
時間點 0.5:strokeEnd已經(jīng)跑到了終點,strokeEnd才跑了一點距離。
時間點 1.0:strokeEnd在終點等著,strokeStart加速趕到了終點。
經(jīng)過此番分析后,動畫相關(guān)的代碼大致如下:

let strokeDuration:Double = 2
func strokeStartAnimation() -> CAKeyframeAnimation {
    let animation = CAKeyframeAnimation(keyPath: "strokeStart")
    animation.keyTimes = [0, 0.5, 1]
    animation.values = [0, 0.3, 1]
    animation.duration = strokeDuration
    animation.fillMode = kCAFillModeForwards
    animation.repeatCount = Float.infinity
    return animation
  }
  
  func strokeEndAnimation() -> CAKeyframeAnimation {
    let animation = CAKeyframeAnimation(keyPath: "strokeEnd")
    animation.keyTimes = [0, 0.5, 1]
    animation.values = [0.05, 1, 1]
    animation.duration = strokeDuration
    animation.fillMode = kCAFillModeForwards
    animation.repeatCount = Float.infinity
    return animation
  }

把這兩個動畫加到了圖層上,就能看到?jīng)]有旋轉(zhuǎn)情況下的效果。再完善一下,添加一個比路徑填充稍微慢一點的旋轉(zhuǎn)動畫,就能達到文初那種似乎不規(guī)則的 loading效果。

不足之處:在路徑動畫一次結(jié)束后切換下一次時感覺沒那么過渡自然,那是因為使用路徑填充實現(xiàn)。如果使用改變路徑長度實現(xiàn)會更好一點(CSS中就可以通過 stroke dash array/offset修改填充長度實現(xiàn)),但在 iOS中,CAShapeLayer的 lineDashPattern 不是 animatable的,導(dǎo)致不能按照 CSS的思路去實現(xiàn)。

其實可以自定義繪制,不過稍顯麻煩,如果你追求 pixel perfect,那就那么做吧。

-EOF-

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

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

  • 的確,聽說他要來時,心里是欣喜的。而另外一層理智也反復(fù)強調(diào)著,這不可能。潛意識里也是覺得,除非腦子瓦特掉了,...
    晝夜思閱讀 356評論 0 1
  • 我只愿意關(guān)注痛苦中的人。因為我自己經(jīng)歷過,所以才會理解對方是什么狀態(tài)。我希望彼此可以開心的在人間自由自在的行...
    靜如初夏閱讀 768評論 0 2
  • 閉月羞花之貌,沉魚落雁之容,短短十二個字,飽含人們對古代四大美女絕世容顏的贊譽。時光流轉(zhuǎn),美人隨風(fēng)而去,我們只能在...
    亭殿閣閱讀 464評論 0 6

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