android animatorset 监听,Android源码分析--动画框架AnimatorSet
這一節,我要介紹的是AnimatorSet。
一提到android的動畫,一定會涉及到AnimatorSet,因為他太好用了。它所封裝的接口讓很多復雜的動畫疊加變得容易。
AnimatorSet是繼承于Animator這個是非常重要的,因為AnimatorSet可以不停的疊加自身,最重要的是他本身就是一個Animator。
我們看一下他播放動畫的方法,可以看到它返回的一個Builder的對象,可以推斷它是使用建造者的形式,不斷迭代動畫。
我們看一下他實際構造的時候使用,保存在mCurrentNode的Node對象里面,Node應該是節點的意思。
每個動畫都應該由節點構成
其Builder里面存在著三種排序,with,before,after(字面意思應該都很清晰)
(1)with的節點可以看到他是通過Dependency的方法來填充到mCurrentNode里面的,很明顯with是并行的
我們可以看到Dependency是只有WITH和AFTER兩個時序。
(2)當使用before的時候,相對于mCurrentNode是node節點之后,所以傳入mCurrentNode到里面
(3)當使用after的時候,相當于node節點是mCurrent節點之后,所以傳入node到里面
使用after延時,其實只是使用一個虛設一個ValueANimator來設定延時時間。
然后我們看一下動畫疊加真正的做法。
(1)playTogethor其實是使用with循環的疊加,其參數是不定量的數組的items
我們可以傳入Collection的對象,意味著我們可以傳入一個列表的Animator
(2)playSequentially是不斷使用before來將動畫放在之后疊加
setTarget的方法是循環獲取node節點的animator動畫,終節點通過ObjectAnimator來設置view目標
setInterpolator設置時間插值器,這個插值器最后會在start的方法中是使用
我們接下來看一下動畫播放的流程
(1)start的方法會先設置一些標志位,然后通過遍歷節點node的animator對象來設置播放同步為false遍歷設置每個動畫對象的運行時間
還會設置每個對象的時間插值器
當使用play,playTogethor,playSequentially的時候還會標志需要排列節點,如果node節點沒有依賴關系的話,全部會被排列到父節點里面,然后再次循環移除node的依賴父節點,加入到tmproot次節點之后,這樣會建立一個統一的mSortedNodes的數組
然后通過遍歷mSortedNodes數組移除舊的監聽器,
設置nodesToStart來控制全部的節點,
然后再次添加上對應的DependecyListener和AnimatorSetListerner
如果判斷延時少于0 ,就把節點的animator播放,并加到mPlayingSet里面,
否則添加值ValueAnimator作為延遲空效果,并通過監聽器來在遍歷播放節點
通過通過回調來調用每個節點監聽器的onAnimationStart,
如果判斷節點內其全部的節點都被執行完,木有延遲,那么觸發節點的onAnimationEnd的方法
start的方法其實還需要涉及到DependecyListener
這里可以看明白,器通過調用onANimationStart和onAnimationEnd判斷運行rule的規則來判斷是否啟動動畫
通過判斷父AnimatorSet是否被取消返回
然后判斷移除dependencies依賴關系
當全部依賴關系滿足的時候,就開啟動畫
(2)使用pause的方法,會讓所有延遲的方法暫停,然后調用每個節點里的pause方法
然后循環調用節點里面的onAnimationPause的方法,暫停每個動畫。
pause的方法是停止在中間的狀態。
resume的方法也是類似的,用來恢復當前pause狀態的動畫運行
(3)canel的方法中,需要判斷是否正在播放
如果正在播放會全部調用節點onAnimationCancel的方法,
然后再遍歷調用延時動畫的cancel方法和節點動畫的cancel方法。
最后出發節點的onAnimationEnd的方法。
觸發剩余調用節點onAnimationCancel的方法,
將全部動畫監聽器移除,將mPlayingSet的動畫移除
將剩下的動畫onDone狀態設置為false,
觸發節點的onAnimationEnd的回調方法
cancel之后動畫會停留在中間運行的狀態
(4)另外一種end的方法也是可以停止動畫運行,
可以看到會停止掉延遲,
然后調用每個動畫的end方法和onAnimationEnd的方法,
最后設置回start的標志
end和cancel的不同是,調用了end的方法,它會把動畫直接發生整個動畫的最后一幀然后停止。
關于AnimatorSet的源碼分析就到這里了。
總結
以上是生活随笔為你收集整理的android animatorset 监听,Android源码分析--动画框架AnimatorSet的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python修改xpath节点_Xpat
- 下一篇: java xml textview居中_