從0到1,開發一個動畫庫(2)

發表於2018-01-30

傳送門:從0到1,開發一個動畫庫(1)

上一節講到了最基礎的內容,為動畫構建“幀-值”對應的函式關係,完成“由幀到值”的計算過程。這一節將在上節程式碼的基礎上談談如何給一個完整的動畫新增各類事件。

在新增各類事件之前,我們先對_loop迴圈函式進行一些改進:

可以清晰地看到,我們在迴圈中增加了很多型別的判斷,根據state當前不同的狀態執行相應的處理函式:我們新增了_end_stop_reset方法分別去處理結束、暫停和重置這三種狀態,接下來我們依次講解這些狀態的處理。

End

我們在Core類下增加_endendrenderEndState方法,end方法用於主動結束動畫:

通過執行end方法,我們可以主動結束動畫:如果當前目標處於運動狀態,則將其設定為end,因此下一個_loop函式被執行的時候,程式就被流向了_end處理函式;若為其他狀態,意味著迴圈沒有被開啟,我們就直接呼叫_end方法,使其直接到終止狀態。

_end函式的作用有三個:

  • 將當前狀態設定為end(為何要重複設定一次狀態呢?這不是多餘的嗎?其實,倘若我們主動觸發end去結束動畫,這的確是多餘的,但如果是動畫自己進行到了末尾,也就是t >= d的時刻,則必須得在_end中去設定狀態,以確保它處於結束狀態)
  • 通過_renderEndState方法,將目標變成結束狀態
  • 若有回撥函式則執行回撥

Reset

重置動畫的方式也是大同小異,與上面一樣

Stop

讓動畫暫停也是與上述兩者一樣,但唯一的區別是,需要給_renderStopState方法傳入當前時間進度:

play

我們要在動畫開始執行的時候觸發onPlay事件,只需在_play方法內增加一行程式碼即可:

完整程式碼如下:

相應地,html的程式碼也更新如下,新增了各類按鈕,主動觸發目標的各類事件:

看到這裡,我們第二節的內容就結束啦,下一節,我們將介紹:

  • 支援自定義路徑動畫
  • 動畫間的鏈式呼叫

下一節再見啦^_^

相關文章