使用RecyclerView和LayoutAnimation给列表添加进入动画
这里讲解下使用RecyclerView和LayoutAnimation给列表添加进入动画。分为三个步骤:
- 给列表项添加动画
- 使用列表项的动画定义LayoutAnimation
- RecyclerView应用LayoutAnimation的动画
使用LayoutAnimation定义动画的好处是,它是单独定义,可以应用于任何ViewGroup的子类。这里是以RecyclerView为示例。
示例效果
示例是一个向下掉的进入效果,如图:
定义列表项动画
在res/anim/路径下添加文件item_animation_fall_down.xml,它用来定义列表项的动画。添加内容如下:
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="@integer/anim_duration_medium">
<translate
android:fromYDelta="-20%"
android:toYDelta="0"
android:interpolator="@android:anim/decelerate_interpolator"
/>
<alpha
android:fromAlpha="0"
android:toAlpha="1"
android:interpolator="@android:anim/decelerate_interpolator"
/>
<scale
android:fromXScale="105%"
android:fromYScale="105%"
android:toXScale="100%"
android:toYScale="100%"
android:pivotX="50%"
android:pivotY="50%"
android:interpolator="@android:anim/decelerate_interpolator"
/>
</set>
说明:
- Translate Y -20%到0%:在动画开始之前,向上移动视图20%的高度,并让它落到最终位置。
- Alpha 0到1:视图从开始完全不可见,并缓慢出现,直至完全可见。
- Scale X/Y 105% 到 100%:scale设置为105%,以使其缩小至最终尺寸。 这会使它看起来好像掉下来一样,落到背景上。
定义LayoutAnimation
使用上面定义的每一项的动画来定义LayoutAnimation。在res/anim/添加layout_animation_fall_down.xml文件,它用来定义LayoutAnimation。内容如下:
<?xml version="1.0" encoding="utf-8"?>
<layoutAnimation
xmlns:android="http://schemas.android.com/apk/res/android"
android:animation="@anim/item_animation_fall_down"
android:delay="15%"
android:animationOrder="normal"
/>
- android:animation="@anim/item_animation_fall_down”:定义将哪个动画应用于布局中的每一项。
- android:delay=”15%":设置动画延迟,0%表示所有项目同时进行动画,100%表示每个项目完成其动画后才开始下一个项目。15%则表示项目动画到达15%时开始下一个项目的动画。
- android:animationOrder="normal":控制内容的动画顺序,有三种类型:normal,reverse和random。normal表示根据布局的自然顺序(垂直:从上到下,水平:从左到右)出现动画。reverse与normal相反。random表示动画随机出现。
应用LayoutAnimation
有两种方式使用LayoutAnimation:编程方式和xml方式。
编程方式:
int resId = R.anim.layout_animation_fall_down;
LayoutAnimationController animation = AnimationUtils.loadLayoutAnimation(ctx, resId);
recyclerview.setLayoutAnimation(animation);
xml方式:
<android.support.v7.widget.RecyclerView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layoutAnimation="@anim/layout_animation_fall_down"
/>
如果需要更改数据集,可以这样做:
private void runLayoutAnimation(final RecyclerView recyclerView) {
final Context context = recyclerView.getContext();
final LayoutAnimationController controller =
AnimationUtils.loadLayoutAnimation(context, R.anim.layout_animation_fall_down);
recyclerView.setLayoutAnimation(controller);
recyclerView.getAdapter().notifyDataSetChanged();
recyclerView.scheduleLayoutAnimation();
}
动画二:从右侧滑入
项目动画:
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="@integer/anim_duration_long">
<translate
android:interpolator="@android:anim/decelerate_interpolator"
android:fromXDelta="100%p"
android:toXDelta="0"
/>
<alpha
android:fromAlpha="0.5"
android:toAlpha="1"
android:interpolator="@android:anim/accelerate_decelerate_interpolator"
/>
</set>
LayoutAnimation动画
<?xml version="1.0" encoding="utf-8"?>
<layoutAnimation
xmlns:android="http://schemas.android.com/apk/res/android"
android:animation="@anim/item_animation_from_right"
android:delay="10%"
android:animationOrder="normal"
/>
动画三:从底部滑入
项目动画
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="@integer/anim_duration_long">
<translate
android:interpolator="@android:anim/accelerate_decelerate_interpolator"
android:fromYDelta="50%p"
android:toYDelta="0"
/>
<alpha
android:fromAlpha="0"
android:toAlpha="1"
android:interpolator="@android:anim/accelerate_decelerate_interpolator"
/>
</set>
LayoutAnimation动画
<?xml version=1.0 encoding=utf-8?>
<layoutAnimation
xmlns:android=http://schemas.android.com/apk/res/android
android:animation=@anim/item_animation_from_bottom
android:delay=15%
android:animationOrder=normal
/>