LayoutTransition是Android 在API 11提供了一個能在當ViewGroup中有新增、刪除、隱藏View時,呈現的動畫。
要做到這樣的效果,只要在Layout 裡設定android:animateLayoutChanges="true",即可以在ViewGroup裡有新增、刪除View時使用動畫。
<LinearLayout
android:id="@+id/resultLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:animateLayoutChanges="true"
android:orientation="vertical">
</LinearLayout>
除了預設的動畫,LayoutTransition提供4種子View變化的類型讓我們加入不同的動畫。
APPEARING:元素在ViewGroup中新增時需要動畫顯示。
DISAPPEARING:元素在ViewGroup中消失時需要動畫顯示。
CHANGE_APPEARING:由於ViewGroup中要顯現一個新的元素,其它元素的變化需要動畫顯示。
CHANGE_DISAPPEARING:由於ViewGroup中某個元素要消失,其它元素的變化需要動畫顯示。
元素在ViewGroup中新增時需要動畫顯示。
步驟1:新增anim_scale_x.xml,設定為放大X為1.5倍再縮回
還記得在Property animation提到的動畫嗎,這裡用的就是Property animation的objectAnimator
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:ordering="sequentially">
<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="1000"
android:propertyName="scaleX"
android:valueFrom="1"
android:valueTo="1.5"
android:valueType="floatType" />
<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="1000"
android:propertyName="scaleX"
android:valueFrom="1.5"
android:valueTo="1"
android:valueType="floatType" />
</set>
步驟2:指定LayoutTransition.APPEARING的動畫為R.animator.anim_scale_x
layoutTransition = LayoutTransition()
resultLayout.layoutTransition = layoutTransition
//View出現的動畫
layoutTransition.setAnimator(LayoutTransition.APPEARING, AnimatorInflater.loadAnimator(this, R.animator.anim_scale_x))
元素在ViewGroup中消失時需要動畫顯示。
同樣的,移除一個View,也能加上客制的動畫,讓被移除的Button加上變紅色的動畫
步驟1:新增anim_color.xml.xml,改為顏色為紅色
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:ordering="sequentially">
<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="200"
android:propertyName="backgroundColor"
android:valueTo="#ff0000" />
</set>
步驟2:指定LayoutTransitions.DISAPPEARING的動畫為R.animator.anim_color
layoutTransition.setAnimator(LayoutTransition.DISAPPEARING, AnimatorInflater.loadAnimator(this, R.animator.anim_color))
由於ViewGroup中要顯現一個新的元素,其它元素的變化需要動畫顯示。
layoutTransition.setAnimator(LayoutTransition.CHANGE_APPEARING, AnimatorInflater.loadAnimator(this, R.animator.layout_change_appearing))
由於ViewGroup中某個元素要消失,其它元素的變化需要動畫顯示。
layoutTransition.setAnimator(LayoutTransition.CHANGE_DISAPPEARING, AnimatorInflater.loadAnimator(this, R.animator.layout_change_disappearing))
完整程式:https://github.com/evanchen76/layouttransition