類似列表的view伸縮動畫

效果


!!! 尼瑪轉成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系列

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,814評論 25 708
  • Android框架提供了兩種類型的動畫:View Animation(也稱視圖動畫)和Property Anima...
    RxCode閱讀 1,680評論 1 5
  • 1 背景 不能只分析源碼呀,分析的同時也要整理歸納基礎知識,剛好有人微博私信讓全面說說Android的動畫,所以今...
    未聞椛洺閱讀 2,735評論 0 10
  • 迷霧之橋,盡頭是什么?你說,只有走過去才知道。 我說,雖然我不知道要走的路是哪一條,但我知道,迷霧之橋,不是我要走...
    晚晚inna閱讀 247評論 0 0
  • 10元,開始時覺得挺少,真的計算覺得能做好多事。
    fd00d08211f4閱讀 237評論 0 0