布局动画主要用来为布局容器设置动画,如ViewGroup及其子类;当容器中的视图发生变化时(如addView,removeView)存在过渡的动画效果。
动画的类型一共有四种:
//当一个View在ViewGroup中出现时,对此View设置的动画
LayoutTransition.APPEARING
//当一个View在ViewGroup中出现时,对此View对其他View位置造成影响,对其他View设置的动画
LayoutTransition.CHANGE_APPEARING
//当一个View在ViewGroup中消失时,对此View设置的动画
LayoutTransition.DISAPPEARING
//当一个View在ViewGroup中消失时,对此View对其他View位置造成影响,对其他View设置的动画
LayoutTransition.CHANGE_DISAPPEARING
//不是由于View出现或消失造成对其他View位置造成影响,然后对其他View设置的动画
LayoutTransition.CHANGE
基本使用方法:
LayoutTransition transition = new LayoutTransition();
//取消进场动画
transition.setAnimator(LayoutTransition.APPEARING,
null);
//设置默认的CHANGE_APPEARING 动画
transition.setAnimator(LayoutTransition.CHANGE_APPEARING,
transition.getAnimator(LayoutTransition.CHANGE_APPEARING));
//设置布局动画
mGridLayout.setLayoutTransition(transition);
布局动画的使用如下示例,实现布局容器addView时从屏幕上方向下平移;removeView时从下向上平移出屏幕的效果。
// 动画:APPEARING
// Adding
private LayoutTransition mTransition = new LayoutTransition();
ObjectAnimator animIn = ObjectAnimator.ofFloat(null, "translationY", -height,
0f).setDuration(1000);
mTransition.setAnimator(LayoutTransition.APPEARING, animIn);
// animIn.addListener(new AnimatorListenerAdapter() {
// public void onAnimationEnd(Animator anim) {
// View view = (View) ((ObjectAnimator) anim).getTarget();
// view.setRotationY(0f);
// }
// });
// 动画:DISAPPEARING
// Removing
ObjectAnimator animOut = ObjectAnimator.ofFloat(null, "translationY", 0,
-height).setDuration(1000);
mTransition.setAnimator(LayoutTransition.DISAPPEARING, animOut);
// animOut.addListener(new AnimatorListenerAdapter() {
// public void onAnimationEnd(Animator anim) {
// View view = (View) ((ObjectAnimator) anim).getTarget();
//// view.setRotationX(0f);
// }
// });
系统默认的布局动画效果如下,具体代码见LayoutTransition源码