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