android-學習屬性動畫源碼(2)

屬性動畫的源碼的確比較複雜,下面雖然將整個流程算是完整的走下來了,但是還是有很多的細節不明白。如果不知道怎麼使用屬性動畫,請看上篇博客:https://blog.csdn.net/yuezheyue123/article/details/81630460
1.我們在activity中使用
這裏寫圖片描述
2.進入靜態方法ofFloat()
這裏寫圖片描述
在ObjectAnimator的構造器中,設置執行動畫的view和執行動畫的屬性名稱
這裏寫圖片描述
這裏面有個重要的類 PropertyValuesHolder,這個類非常的重要,下面要經常遇見。
這裏寫圖片描述
下面是重要的方法anim.setFloatValues(values)
這裏寫圖片描述
查找PropertyValuesHolder,ofFloat()方法,一直查詢到最後是調用了下面方法
這裏寫圖片描述
這個方法調用父類方法後
這裏寫圖片描述
調用KeyframeSet.ofFloat(values)方法,這個方法是將最初傳進過來的可變參數,進行重新的封裝,並且分爲了兩種情況,如果可變參數只傳遞了一個參數,那麼就默認添加一個初始關鍵幀,並將傳入的那個參數設置最後一個關鍵幀。如果已經傳遞了多個參數,那麼就將各個參數設置成關鍵幀。
這裏寫圖片描述
3.執行start()方法
最終是調用了ValueAnimator的start()方法,其中關鍵的方法有三個 animationHandler.addAnimationFrameCallback(….),startAnimation()和setCurrentPlayTime(0)。其中setCurrentPlayTime(0)和setCurrentFraction()裏面調用的是同一方法。
這裏寫圖片描述
這裏寫圖片描述
先看animationHandler.addAnimationFrameCallback(….)。注意這裏的postFrameCallback(mFrameCallback)的參數,非常重要,這裏創建了一個回調。
這裏寫圖片描述
這個就是參數創愛的回調方法,在後面非常重要,要進行使用。
這裏寫圖片描述
其中getProvider()是MyFrameCallbackProvider()類的對象。
這裏寫圖片描述
內層調用時添加了幾層封裝後到達下面的方法。這裏是使用hanlder的進行消息的發送,android很多地方都是基於消息機制。
這裏寫圖片描述
下面的handler具有三種情況。
這裏寫圖片描述
首先執行的就是doScheduleCallback()方法。
這裏寫圖片描述
這裏寫圖片描述
調用handler的doFrame()方法
這裏寫圖片描述
這裏寫圖片描述
這裏寫圖片描述
其中重要的方法就是doCallbacks()方法
這裏寫圖片描述
這裏寫圖片描述
這裏寫圖片描述
重要的就是調用c.run(….)方法,點擊進入後發現是這樣情況。其中的action就是最初上面傳遞過過來的參數mFrameCallback。
這裏寫圖片描述
就是最初創的對象,然後調用doAnimationFrame()方法
這裏寫圖片描述
然後調用callback.doAnimationFrame()方法,這裏的mAnimationCallbacks就是啓動動畫的個數。當你調用start()方法的時候就添加了一個callback.
這裏寫圖片描述
因此要在ValueAnimator中找尋doAnimationFrame()方法。
這裏寫圖片描述
這裏寫圖片描述
最終調用的是animateBaseOnTime()方法
這裏寫圖片描述
這裏到達了一個重要的方法animateValue(),這裏並沒有有什麼執行動畫的代碼,真正的執行的代碼是在子類ObjectAnimator中。
這裏寫圖片描述
子類中調用setAnimatedValue()方法,這裏的mValues就是PropertyValuesHolder的對象
這裏寫圖片描述
這裏可以看到執行了invoke()方法,利用了反射。
這裏寫圖片描述
然後查看startAnimation()方法,這裏的重要方法initAnimation(),其實在子類中進行重寫。
這裏寫圖片描述
這裏寫圖片描述
這裏其實也是執行PropertyValuesHolder中的方法。這裏其中有多個同名的方法,我感覺是調用了這個方法
這裏寫圖片描述
這裏寫圖片描述
calculateValue(0f);獲取到第一幀。
nGetMultipleFloatMethod()獲取到setXXX()方法。
最後調用setCurrentFraction()方法,還是調用animateValue()方法
這裏寫圖片描述
通過差值器獲取執行的百分比
這裏寫圖片描述
最後在View中能找到這些方法
這裏寫圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章