記錄一些設計上的事兒

不知道今天能不能寫完一篇完整的文章,除非沒人打擾我。設計模式

書歸正傳!動畫

前段時間給人家作了一個應用,有一個相似於展現詳情信息的界面,以下圖所示,我想說一下關於動畫對象的事,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();

  就這樣簡單的幾句就搞定。是否是很節省資源。

相關文章
相關標籤/搜索