不知道今天能不能寫完一篇完整的文章,除非沒人打擾我。設計模式
書歸正傳!動畫
前段時間給人家作了一個應用,有一個相似於展現詳情信息的界面,以下圖所示,我想說一下關於動畫對象的事,ui
在應用中使用動畫時很是常見的,我本身比較喜歡加一些小的動畫來讓應用更加的生動,調節一下氣氛。如今用的最多的Animator這個對象,以前用Animation,慢慢的被淘汰了,由於它只能改變試圖,卻沒法真正的改變對象的屬性(表面上是動了)。設計
因此,Animator是我不二的選擇。對象
第一次用這個對象的時候覺的特別的好用,又一次我把一個物體從屏幕的上面移動到了下邊,並且物體的屬性是實實在在的被改變了,而後需求讓我再一次的讓物體回到原位(仍是以動畫的形式,至關於倒着播放一次),因而我開始找back()或者reverse()這樣的方法,可是,沒有!我尚未放棄,我查看了和Animator相關的類,包括AniamtorSet,Aniamtor.Builder等,都好像沒有直接能夠達到目的的方法,這樣我該放棄了,必定是要從新建立animator對象的。blog
上面一次動畫的顯示牽動了6個對象,也就是建立出6個Animator對象一塊兒執行或在某個地方觸發執行,當列表被推到上面後,動畫執行結束,當列表被拉下後,以前的動畫要被從新反着執行一次。隊列
思考:資源
一、6個對象,起碼要有6組動畫起始數據要保存,難道都要做爲成員變量放在一個類裏面?起名字就夠累的。get
二、建立了6個動畫對象在所不免,可是每次動畫都要從新建立一次嗎?尤爲是鏡像返回的動畫,可不能夠重複利用建立好的動畫對象,把起始和結束的值相互換一下位置就能夠了呢?io
帶着以上的問題,爲了讓代碼更加的緊湊和有良好的設計感,我作了些封裝,只是封裝和一些經常使用的設計。
首先,我設計了一個類,起名叫作AnimtorsHolder,
首先它是個單例,裏面只有兩個私有成員變量,一個是它本身自己,另一個是ArrayList容器,裏面放的是AnimatorObject,大家都見過ObjectAnimator,可是沒加過它吧,順便多一嘴,ValueAnimator要比ObjectAnimator更加節省資源(播放動畫卡不卡很明顯)多用ValueAnimator吧。這個AnimatorObject也是我設計的類,放到後面說。
再看AnimtorsHolder類,有四個公有方法,getInstance返回一個單例,add方法是向ArrayList裏添加對象,只用add的是(Object obj),看到這裏應該知道用到那幾個設計模式了吧,嘿嘿。
public void add(AnimatorObject object) {
animatorObjects.add(object);
}
getAnimators方法
public ArrayList<Animator> getAnimators() {
ArrayList<Animator> animators = new ArrayList<Animator>();
for (AnimatorObject object : animatorObjects) {
animators.add(object.getAnimator());
}
return animators;
}
這個方法其實就是建立一個裝Animator的容器,將外部的成員容器遍歷一遍從AnimatorObject獲取到Animator對象
getBackAnimators(),同樣,先建立一個裝Animator的容器,將外部的成員容器遍歷一遍從AnimatorObject獲取到Animator對象,而且獲取到起始和結束的值(改進,把這些值放入到隊列裏,這樣正序倒序隨意取)反着賦值,這裏因爲不肯定是Int仍是Float,爲此還判斷了一下,這樣處理事後,容器裏存放的Animator對象的屬性就是反着的了,而且經過這樣的設計,也沒有從新建立Aniamtor對象。
public ArrayList<Animator> getBackAnimators() {
ArrayList<Animator> animators = new ArrayList<Animator>();
for (AnimatorObject object : animatorObjects) {
ValueAnimator animator = (ValueAnimator) object.getAnimator();
Object start = object.getStart();
Object end = object.getEnd();
if(start instanceof Integer) {
animator.setIntValues((int)end, (int)start);
} else if (start instanceof Float){
animator.setFloatValues((float)end, (float)start);
}
animators.add(animator);
}
return animators;
}
看如何使用的
/*初始化AnimatorsHolder*/
animators = AnimatorsHolder.getInstance();
/*建立一個動畫對象*/
ValueAnimator moveY = ValueAnimator.ofInt(start, end);
/*調用AnimatorsHolder的add方法,而且建立一個AnimatorObject對象他是個泛型(改進:應該使用動態參數的設計)*/
animators.add(new AnimatorObject<Integer>(moveY, start, end));
/*播放動畫*/
AnimatorSet palySet = new AnimatorSet();
palySet.setDuration(300);
palySet.playTogether(animators.getAnimators());
palySet.start();
若是想把以前建立的動畫反着播一遍,這樣。
AnimatorSet palySet = new AnimatorSet();
palySet.setDuration(300);
palySet.playTogether(animators.getBackAnimators());
palySet.start();
就這樣簡單的幾句就搞定。是否是很節省資源。