日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

android animatorset 监听,Android源码分析--动画框架AnimatorSet

發(fā)布時間:2024/7/23 Android 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 android animatorset 监听,Android源码分析--动画框架AnimatorSet 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

這一節(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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。