Layout Animations主要使用LayoutTransition爲佈局的容器設置動畫,當容器中的視圖層次發生變化時存在過渡的動畫效果。
LayoutTransition
This class enables automatic animations on layout changes in ViewGroup objects. To enable transitions for a layout container, create a LayoutTransition object and set it on any ViewGroup by calling setLayoutTransition(LayoutTransition)
. This will cause default animations to run whenever items are added to or removed from that container. To specify custom animations, use the setAnimator() method.
對應理解:當在ViewGroup容器中視圖層次放生改變時,LayoutTransition能夠自動的設置過度的動畫。在視圖容器中爲了能夠轉換,我們通過創建一個ViewGroup對象調用setLayoutTransition(LayoutTransition)
在ViewGroup設置這個過度動畫。我們也可以在視圖的添加和刪除時通過setAnimator()來設置動畫。
我們來看一下LayoutTransition的使用:
LayoutTransition transition = new LayoutTransition();//創建LayoutTransition的對象。
transition.setDuration(3000);//設置添加過度動畫顯示的時間。
transition.setAnimator(LayoutTransition.APPEARING, AnimatorInflater.loadAnimator(this, R.animator.animator));//添加動畫
mGridLayout.setLayoutTransition(transition);//將LayoutTransition添加到ViewGroup容器中。
Layout Animations實例應用
我們在佈局中添加一個按鈕,通過點擊按鈕來實現在GridLayout佈局中動畫形式增加一個按鈕,點擊添加按鈕,按鈕會自動刪除。
佈局文件:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.example.administrator.myanimation.LayoutAnimatorActivity">
<Button
android:id="@+id/button"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="添加按鈕"/>
<GridLayout
android:id="@+id/gridlayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:columnCount="5"></GridLayout>
</LinearLayout>
Activity:
public class LayoutAnimatorActivity extends Activity {
private Button mButtonAdd;
private GridLayout mGridLayout;
private int count;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_layout_animator);
mButtonAdd = (Button) findViewById(R.id.button);
mGridLayout = (GridLayout) findViewById(R.id.gridlayout);
//設置佈局的動畫
LayoutTransition transition = new LayoutTransition();
transition.setDuration(1000);
transition.setAnimator(LayoutTransition.APPEARING, transition
.getAnimator(LayoutTransition.APPEARING));
transition.setAnimator(LayoutTransition.CHANGE_APPEARING, transition.getAnimator(LayoutTransition.CHANGE_APPEARING));
transition.setAnimator(LayoutTransition.DISAPPEARING, transition.getAnimator(LayoutTransition.DISAPPEARING));
transition.setAnimator(LayoutTransition.CHANGE_DISAPPEARING, transition.getAnimator(LayoutTransition.CHANGE_DISAPPEARING));
mGridLayout.setLayoutTransition(transition);
mButtonAdd.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
count++;
final Button button = new Button(LayoutAnimatorActivity.this);
ViewGroup.LayoutParams params = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
button.setLayoutParams(params);
button.setText(""+count);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mGridLayout.removeView(v);
}
});
mGridLayout.addView(button);
}
});
}
}
這裏使用到了LayoutTransition的四種效果:
APPEARING:當一個View在ViewGroup中出現時,對此View設置的動畫
CHANGE_APPEARING:當一個View在ViewGroup中出現時,對此View對其他View位置造成影響,對其他View設置的動畫。
DISAPPEARING: 當一個View在ViewGroup中消失時,對此View設置的動畫。
CHANGE_DISAPPEARING: 當一個View在ViewGroup中消失時,對此View對其他View位置造成影響,對其他View設置的動畫。
CHANGE: 不是由於View出現或消失造成對其他View位置造成影響,然後對其他View設置的動畫。