前言
這里,講解的是animateLayoutChanges與LayoutTransition的實現方式,所以要求API>=11。
一、使用默認動畫
android:animateLayoutChanges=[true/false],所有派生自ViewGroup的控件都具有此屬性,只要在XML中添加上這個屬性,就能實現添加/刪除其中控件時,帶有默認動畫了。
默認的進入動畫就是上部控件下移,然后新添控件透明度從0到1顯示出來。默認的退出動畫是控件透明度從1變到0消失,下部控件上移
什么時候會有這個動畫呢?代碼中調用了addView 之類的方法的時候,例如
private void addButtonView() {
Button button = new Button(this);
button.setText("button");
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,
ViewGroup.LayoutParams.WRAP_CONTENT);
button.setLayoutParams(params);
groupView.addView(button, 0);
}
private void removeButtonView() {
groupView.removeViewAt(0);
}
二、使用自定義動畫LayoutTransition
- 建立LayoutTransaction實例
LayoutTransition transitioner = new LayoutTransition();
2.建立Animator實例,并使用
ObjectAnimator outAnim = ObjectAnimator.ofFloat(null, "rotation", 0f, 200f);
transitioner.setAnimator(LayoutTransition.DISAPPEARING, outAnim);
ObjectAnimator inAnim = ObjectAnimator.ofFloat(null, "rotation", 200f, 0f);
transitioner.setAnimator(LayoutTransition.APPEARING, inAnim);
ObjectAnimator changeAnim = ObjectAnimator.ofPropertyValuesHolder(groupView,
PropertyValuesHolder.ofInt("left", 0, 600,0),
PropertyValuesHolder.ofInt("top", 0,0));
transitioner.setAnimator(LayoutTransition.CHANGE_APPEARING, changeAnim);
APPEARING —— 元素在容器中出現時所定義的動畫。
**DISAPPEARING **—— 元素在容器中消失時所定義的動畫。
CHANGE_APPEARING —— 由于容器中要顯現一個新的元素,其它需要變化的元素所應用的動畫
CHANGE_DISAPPEARING —— 當容器中某個元素消失,其它需要變化的元素所應用的動畫
3.設置進VIEWGROUP
linear.setLayoutTransition(transitioner);
4.調用
public void addButtonView(View view) {
Button button = new Button(this);
button.setText("button");
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
button.setLayoutParams(params);
groupView.addView(button, 0);
}
public void removeButtonView(View view) {
groupView.removeViewAt(0);
}
效果:
注意事項,非常重要!?。?/h1>
1.LayoutTransition.CHANGE_APPEARING、LayoutTransition.CHANGE_DISAPPEARING 必須使用PropertyValuesHolder所構造的動畫才會有效果,不然無效!也就是說使用ObjectAnimator構造的動畫,在這里是不會有效果的!
2.在構造PropertyValuesHolder動畫時,”left”、”top”屬性的變動是必寫的。如果不需要變動,則直接寫為:
PropertyValuesHolder pvhLeft = PropertyValuesHolder.ofInt("left",0,0);
PropertyValuesHolder pvhTop = PropertyValuesHolder.ofInt("top",0,0);
1.LayoutTransition.CHANGE_APPEARING、LayoutTransition.CHANGE_DISAPPEARING 必須使用PropertyValuesHolder所構造的動畫才會有效果,不然無效!也就是說使用ObjectAnimator構造的動畫,在這里是不會有效果的!
2.在構造PropertyValuesHolder動畫時,”left”、”top”屬性的變動是必寫的。如果不需要變動,則直接寫為:
PropertyValuesHolder pvhLeft = PropertyValuesHolder.ofInt("left",0,0);
PropertyValuesHolder pvhTop = PropertyValuesHolder.ofInt("top",0,0);
3.在構造PropertyValuesHolder時,所使用的ofInt,ofFloat中的參數值,第一個值和最后一個值必須相同,不然此屬性所對應的的動畫將被放棄,在此屬性值上將不會有效果;
PropertyValuesHolder pvhLeft = PropertyValuesHolder.ofInt("left",0,100,0);
4.在構造PropertyValuesHolder時,所使用的ofInt,ofFloat中,如果所有參數值都相同,也將不會有動畫效果。
比如:
PropertyValuesHolder pvhLeft = PropertyValuesHolder.ofInt("left",100,100);
在這條語句中,雖然首尾一致,但由于全程參數值相同,所以left屬性上的這個動畫會被放棄,在left屬性上也不會應用上任何動畫。
四、LayoutTransaction的其他函數
- 基本函數
/**
* 設置所有動畫完成所需要的時長
*/
public void setDuration(long duration)
/**
* 針對單個type,設置動畫時長;
* transitionType取值為:APPEARING、DISAPPEARING、CHANGE_APPEARING、CHANGE_DISAPPEARING
*/
public void setDuration(int transitionType, long duration)
/**
* 針對單個type設置插值器
* transitionType取值為:APPEARING、DISAPPEARING、CHANGE_APPEARING、CHANGE_DISAPPEARING
*/
public void setInterpolator(int transitionType, TimeInterpolator interpolator)
/**
* 針對單個type設置動畫延時
* transitionType取值為:APPEARING、DISAPPEARING、CHANGE_APPEARING、CHANGE_DISAPPEARING
*/
public void setStartDelay(int transitionType, long delay)
/**
* 針對單個type設置,每個子item動畫的時間間隔
*/
public void setStagger(int transitionType, long duration)
- LayoutTransition設置監聽
public void addTransitionListener(TransitionListener listener)
TransitionListener解析:
public interface TransitionListener {
public void startTransition(LayoutTransition transition, ViewGroup container,View view, int transitionType);
public void endTransition(LayoutTransition transition, ViewGroup container,View view, int transitionType);
}
LayoutTransition transition:當前的LayoutTransition實例
ViewGroup container:當前應用LayoutTransition的container
View view:當前在做動畫的View對象
int transitionType:當前的LayoutTransition類型,取值有:APPEARING、DISAPPEARING、CHANGE_APPEARING、CHANGE_DISAPPEARING