有些时候,我们需要在代码中手动创建View,并添加到ViewGroup中, 此时如果我们想要有添加动画,那么就要借助于LayoutTransition(好像是3.0以后才有的吧),下面是一些基本代码,记录下来
/**ViewGroup中添加View时的动画操作对象*/
private LayoutTransition mTransitioner;
/**设置ViewGroup添加子View时的动画*/
private void setLinearContainerAnimation()
{
mTransitioner = new LayoutTransition();
mTransitioner.setStagger(LayoutTransition.CHANGE_APPEARING, 100);//添加View
mTransitioner.setStagger(LayoutTransition.CHANGE_DISAPPEARING, 100);//移除View
//定制动画
setupCustomAnimations();
//设置mLinearContainer布局改变时动画
mLinearContainer.setLayoutTransition(mTransitioner);
}
/**定制ViewGroup添加View时显示的动画*/
private void setupCustomAnimations()
{
// 添加改变时执行
PropertyValuesHolder pvhLeft =
PropertyValuesHolder.ofInt("left", 0, 1);
PropertyValuesHolder pvhTop =
PropertyValuesHolder.ofInt("top", 0, 1);
PropertyValuesHolder pvhRight =
PropertyValuesHolder.ofInt("right", 0, 1);
PropertyValuesHolder pvhBottom =
PropertyValuesHolder.ofInt("bottom", 0, 1);
PropertyValuesHolder pvhScaleX =
PropertyValuesHolder.ofFloat("scaleX", 1f, 0f, 1f);
PropertyValuesHolder pvhScaleY =
PropertyValuesHolder.ofFloat("scaleY", 1f, 0f, 1f);
final ObjectAnimator changeIn = ObjectAnimator.ofPropertyValuesHolder(
this, pvhLeft, pvhTop, pvhRight, pvhBottom, pvhScaleX, pvhScaleY).
setDuration(mTransitioner.getDuration(LayoutTransition.CHANGE_APPEARING));
mTransitioner.setAnimator(LayoutTransition.CHANGE_APPEARING, changeIn);
changeIn.addListener(new AnimatorListenerAdapter()
{
public void onAnimationEnd(Animator anim)
{
View view = (View) ((ObjectAnimator) anim).getTarget();
view.setScaleX(1f);
view.setScaleY(1f);
}
});
// 移除改变时执行
Keyframe kf0 = Keyframe.ofFloat(0f, 0f);
Keyframe kf1 = Keyframe.ofFloat(.9999f, 360f);
Keyframe kf2 = Keyframe.ofFloat(1f, 0f);
PropertyValuesHolder pvhRotation =
PropertyValuesHolder.ofKeyframe("rotation", kf0, kf1, kf2);
final ObjectAnimator changeOut = ObjectAnimator.ofPropertyValuesHolder(
this, pvhLeft, pvhTop, pvhRight, pvhBottom, pvhRotation).
setDuration(mTransitioner.getDuration(LayoutTransition.CHANGE_DISAPPEARING));
mTransitioner.setAnimator(LayoutTransition.CHANGE_DISAPPEARING, changeOut);
changeOut.addListener(new AnimatorListenerAdapter()
{
public void onAnimationEnd(Animator anim)
{
View view = (View) ((ObjectAnimator) anim).getTarget();
view.setRotation(0f);
}
});
// 添加时执行
ObjectAnimator animIn = ObjectAnimator.ofFloat(null, "rotationY", 90f, 0f).
setDuration(mTransitioner.getDuration(LayoutTransition.APPEARING));
mTransitioner.setAnimator(LayoutTransition.APPEARING, animIn);
animIn.addListener(new AnimatorListenerAdapter()
{
public void onAnimationEnd(Animator anim)
{
View view = (View) ((ObjectAnimator) anim).getTarget();
view.setRotationY(0f);
}
});
// 移除View时执行的动画
ObjectAnimator animOut = ObjectAnimator.ofFloat(null, "rotationX", 0f, 90f).
setDuration(mTransitioner.getDuration(LayoutTransition.DISAPPEARING));
mTransitioner.setAnimator(LayoutTransition.DISAPPEARING, animOut);
animOut.addListener(new AnimatorListenerAdapter()
{
public void onAnimationEnd(Animator anim)
{
View view = (View) ((ObjectAnimator) anim).getTarget();
view.setRotationX(0f);
}
});
}