给ViewGroup添加LayoutAnimation

先贴一个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. 两篇参考博客:

猜你喜欢

转载自blog.csdn.net/chenrenxiang/article/details/80480615