布局动画

Android动画机制提供了视图动画、属性动画和可绘制动画,这些动画都是针对单个View对象的,而布局动画(Layout Animation)作用的对象是ViewGroup,它可以在ViewGroup布局子View时,为子View添加相应的动画效果。

LayoutAnimation

LayoutAnimation在API Level 1就已经提供了,它对ViewGroup所有的子View都产生动画效果。LayoutAnimation有XML文件和Java代码两种使用方式。

XML文件

  • 定义layoutAnimation
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?xml version="1.0" encoding="utf-8"?>
<!--
animation: 指定动画资源animation, 注意不能使用animator.

animationOrder: 动画执行顺序, normal(正序)、reverse(倒序)、random(随机)。

delay: ViewGroup中单个子View动画的开始延时, 取值是android:animation所指定动画时长的倍数,
可以是float, 也可以是百分数, 默认0.5; 比如anim_rotation中定义的动画时长是500ms, 这里delay=1,
那么在上一个子View的动画执行之后延时500ms执行下一个子View的动画。
-->
<layoutAnimation xmlns:android="http://schemas.android.com/apk/res/android"
android:animation="@anim/anim_rotation"
android:animationOrder="normal"
android:delay="0.5"/>
  • 在ViewGroup中加载动画
1
android:layoutAnimation="@anim/layout_animation"

Java代码

1
2
3
4
5
6
7
8
9
// 加载动画
Animation animation = AnimationUtils.loadAnimation(this, R.anim.anim_rotation);
// 设置布局动画
LayoutAnimationController animationController =
new LayoutAnimationController(animation, 1f);
animationController.setInterpolator(new AccelerateDecelerateInterpolator());
animationController.setOrder(LayoutAnimationController.ORDER_NORMAL);
// 加载布局动画
viewGroup.setLayoutAnimation(animationController);

注意

  1. 系统提供了gridLayoutAnimation用于给Gridview设置布局动画,对应的XML标签为 gridLayoutAnimation,对应的类为GridLayoutAnimationController;
  2. LayoutAnimation只在在创建ViewGroup的时候生效,后续添加的子View是没有动画效果的;

LayoutTransition

LayoutTransition是API Level 11才出现的,其动画效果只有当ViewGroup添加、删除、隐藏、显示子View的时候才会展示出来,所以,LayoutTransition是一个布局改变动画。LayoutTransition也有XML文件和Java代码两种使用方式。

XML文件

使用XML文件只能使用系统默认的LayoutTransition动画效果。

1
2
<!-- 使用系统默认的LayoutTransition动画 -->
android:animateLayoutChanges="true"

Java代码

使用Java代码可以自定义LayoutTransition动画效果

1
2
3
4
5
6
// 使用自定义LayoutTransition动画
LayoutTransition transition = new LayoutTransition();
Animator animator = AnimatorInflater.loadAnimator(this, R.animator.animator_rotation);
transition.setAnimator(LayoutTransition.APPEARING, animator);
transition.setDuration(2000);
viewGroup.setLayoutTransition(transition);

设置自定义动画时,有以下几种方式:

  • LayoutTransition.APPEARING:View添加时的动画。
  • LayoutTransition.CHANGE_APPEARING:View添加导致布局改变时整个布局容器的动画。
  • LayoutTransition.DISAPPEARING:View消失时的动画。
  • LayoutTransition.CHANGE_DISAPPEARING:View消失导致布局容改变时整个布局容器的动画。
  • LayoutTransition.CHANGE:不是由于View出现或消失造成改变的时候整个布局容器的动画。
坚持原创技术分享,您的支持将鼓励我继续创作!