先贴一个ViewGroup
的方法: ViewGroup.setLayoutAnimation(LayoutAnimationController controller);
最近才知道这个方法,实在是惭愧(以前都干嘛去了?)!
先说下这个方法的作用:用来给ViewGroup
中的子控件添加入场动画。要注意的是:
- 它的动画效果只能作用于直接子控件,对于子控件的子控件没有效果
- 它的动画效果将作用于所有直接子控件
其中LayoutAnimationController
是一个动画控制器,用它来设置动画及控制动画的播放,它甚至可以控制每一个子控件的动画执行顺序。
1. 基本使用方法
先展示一段代码:
subLayout = findViewById(R.id.sub_activity_layout);
subLayout.setLayoutAnimation(new LayoutAnimationController(AnimationUtils.loadAnimation(this, R.anim.left_in), 0.5f)
LayoutAnimationController
构造方法接受两个参数,第一个是Animation
,即你想添加的动画,第二个用来定义延迟时间。
第二个参数并不是直接代表时间,而是表示动画执行时间的百分比。子控件会一个接着一个执行动画,这个百分比就表示两个子控件之间开始动画的时间间隔。如果Animation
定义的动画时间是200毫秒
,而传入的参数是0.5f
,那么当第一个子控件的动画执行到一半,即100毫秒
时,第二个子控件才开始执行动画。如果想让所有子控件同时执行动画,只要把参数设为0f
即可。这个参数也可以不传,LayoutAnimationController
也有一个只接受一个Animation
参数的构造方法,如果不传的话,延迟百分比会默认为0.5f
。
2. 控制子控件动画执行顺序
LayoutAnimationController
还提供一个可以override
的方法: getTransformedIndex
如下:
subLayout.setLayoutAnimation(new LayoutAnimationController(AnimationUtils.loadAnimation(this, R.anim.left_in), 0f){
@Override
protected int getTransformedIndex(AnimationParameters params) {
return params.index >= 1 ? 1 : 0;
}
});
其中params.index
表示子控件在父控件中的位置,返回的参数表示动画执行顺序,值越小越先执行。比如这里的
return params.index >= 1 ? 1 : 0;
表示所有index >= 1
的子控件的动画执行顺序都为1,而小于1,即第一个子控件的动画执行顺序为0。所以第一个子控件会优先执行动画,然后剩下的控件将一起执行动画。
3. 两篇参考博客:
- 也可以直接在
xml
中给ViewGroup
添加LayoutAnimation
, 使用属性android:layoutAnimation
, 加载布局的时候就会自动播放动画。可以参考这篇博客 Android LayoutAnimation使用及扩展 - 使用
LayoutAnimation
与RecyclerView
结合实现漂亮的item
进入动画 RecyclerView 与 LayoutAnimation 实现的进入动画