一)使用LayoutTranistion制作布局过渡动画
使用布局过渡动画的ViewGroup中的view分为两类:
1)通过调用setVisibility()方法从ViewGroup中添加或去除的View,这类View使用显示(appearing)和消失过渡动画(disappearing).
2)剩余View,这类View在上一类View发生改变时,也会使用相应的过渡动画(因显示引起布局改变的过渡动画和因消失引起布局改变的过渡动画)来移动到新的位置。
如果使用系统默认的布局过渡动画的话,只需设置android:animateLayoutchanges属性为true即可。在XML中为ViewGroups提供默认的布局过渡动画.如:
<LinearLayout
android:orientation="vertical"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:id="@+id/verticalContainer"
android:animateLayoutChanges="true" />
也可以自定义过渡动画,调用LayoutTransiton对象的setAnimator()方法,在该方法中传入如下参数之一和一个Animator对象:
APPEARING - 标识该动画在容器(ViewGroup)中正在显示的View上运行。
CHANGE_APPEARING - 标识该动画在容器(ViewGroup)中因新View出现而引起改变的其他View上运行。
DISAPPEARING - 标识该动画在容器(ViewGroup)中正在消失的View上运行。A flag indicating the animation that runs onitems that are disappearing from the container.
CHANGE_DISAPPEARING - 标识该动画在容器(ViewGroup)中因莫View消失而引起改变的其他View上运行。
在代码中,使用ViewGroups的setLayoutTransition(LayoutTransition transition)方法来设置该ViewGroup采用某过渡动画。
二)指定关键帧(Keyframes)
Keyframe对象包含一个时间/值对,可以用来指定动画中特定时间的状态。每个keyframe还可以拥有自己的插值器来控制前一个keyframe与该frame之间的时间间隔中的动画行为。
可以通过使用Keyframe的工厂方法ofInt(),ofFloat()或ofObject()来获取Keyframe实例。 然后使用ofKeyframe()方法获得一个PropertyValuesHolder对象, 然后将该对象和动画目标对象作为参数传给ofPropertyValuesHoder来获取Animator对象。例子如下:
Keyframe kf0 = Keyframe.ofFloat(0f,0f);
Keyframe kf1 =Keyframe.ofFloat(.5f,360f);
Keyframe kf2 =Keyframe.ofFloat(1f,0f);
PropertyValuesHolder pvhRotation = PropertyValuesHolder.ofKeyframe("rotation", kf0, kf1, kf2);
ObjectAnimator rotationAnim = ObjectAnimator.ofPropertyValuesHolder(target, pvhRotation)
rotationAnim.setDuration(5000ms);
三)使用ViewPropertyAnimator来制作动画
ViewPropertyAnimator提供了一种简单的方法来对View的多个属性同时播放动画。 与ObjectAnimator类似,在同时操作多个属性时更方便,代码也更简洁。下面是与使用多个ObjectAnimator, 使用一个ObjectAnimator和使用ViewPropertyAnimator同时操作View的x值和y值的比较:
Multiple ObjectAnimatorobjects
ObjectAnimator animX = ObjectAnimator.ofFloat(myView,"x", 50f);
ObjectAnimator animY = ObjectAnimator.ofFloat(myView,"y", 100f);
AnimatorSet animSetXY = new AnimatorSet();
animSetXY.playTogether(animX, animY);
animSetXY.start();
One ObjectAnimator
PropertyValuesHolder pvhX = PropertyValuesHolder.ofFloat("x",50f);
PropertyValuesHolder pvhY = PropertyValuesHolder.ofFloat("y",100f);
ObjectAnimator.ofPropertyValuesHolder(myView, pvhX, pvyY).start();
ViewPropertyAnimator
myView.animate().x(50f).y(100f);