類似列表的view伸縮動畫

weixin_33890499發表於2017-03-09
4892003-6b7af23e81c73ff3.gif
效果

4892003-f4b00b6a7d6d89ba.jpg

!!! 尼瑪轉成gif這麼卡 真實效果很流暢


1,寫出所要實現的動畫效果
private void doAnim(MyLin view, int i, final boolean v) {
       // 運用PropertyValuesHolder 完成組合動畫
        PropertyValuesHolder valuesHolder;
        PropertyValuesHolder valuesHolder3;
        ObjectAnimator objectAnimator;
        // translationY : 縱向移動
        // alpha : 透明度
        if (v){   // 隱藏   
            valuesHolder = PropertyValuesHolder.ofFloat("translationY", 0.0f, -(view.getHeight())*i); // 這裡 *i 是因為每個控制元件向上移動的距離都不一樣
            valuesHolder3 = PropertyValuesHolder.ofFloat("alpha", 1.0f, 0);
            objectAnimator = ObjectAnimator.ofPropertyValuesHolder(view, valuesHolder,valuesHolder3);
        }else{   // 顯示
            valuesHolder = PropertyValuesHolder.ofFloat("translationY",-(view.getHeight())*i ,0.0f );
            valuesHolder3 = PropertyValuesHolder.ofFloat("alpha",0f , 1.0f);
            objectAnimator = ObjectAnimator.ofPropertyValuesHolder(view, valuesHolder,valuesHolder3);
        }
        objectAnimator.setDuration(500).start();  //  動畫執行時間 300 毫秒
    }
       objectAnimator.addListener(new AnimatorListenerAdapter() {
            @Override
            public void onAnimationEnd(Animator animation) {
                if (v)
                    imageView.setVisibility(View.GONE);  // 當收縮動畫完成時,隱藏所有view
            }
        });
2, 啟動動畫
 @OnClick(R.id.image1)
    public void onClick() {
        for (int i = 0; i < myLins.size(); i++) {
            if (v){   // v 是否已經隱藏和顯示標記
                doAnim(myLins.get(i),i+1,v);  //ViewGroup 中的每個view 都單獨執行一遍動畫
                if ((myLins.size()-1) == i)
                    v = false;
            }else { 
                myLins.get(i).setVisibility(View.VISIBLE);   // 在開始動畫之前顯示出所有view
                doAnim(myLins.get(i),i+1,v);
                if ((myLins.size()-1) == i)
                    v = true;
            }
        }
}
3,因為佈局容器中新增android:animateLayoutChanges=”true”的屬性,當ViewGroup控制元件裡有View VISIBLE或GONE 時啟動預設動畫效果,所以當手動 setVisibility(View.VISIBLE/GONE ) 時會出現動畫重複的現象,
因此,將子控制元件顯現和消失的動畫置空,其他動畫不改變.

  //初始化容器動畫
  mTransitioner = new LayoutTransition();
  ll.setLayoutTransition(mTransitioner);   // ll 為ViewGroup
  // view出現時 view自身的動畫效果置空
   mTransitioner.setAnimator(LayoutTransition.APPEARING, null);
  // view消失時 view自身的動畫效果置空
   mTransitioner.setAnimator(LayoutTransition.DISAPPEARING, null);

參考文件 : Android屬性動畫Property Animation系列

相關文章