使用RecyclerView和LayoutAnimation给列表添加进入动画

这里讲解下使用RecyclerView和LayoutAnimation给列表添加进入动画。分为三个步骤:

  1. 给列表项添加动画
  2. 使用列表项的动画定义LayoutAnimation
  3. 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
    />

摘录自:https://proandroiddev.com/enter-animation-using-recyclerview-and-layoutanimation-part-1-list-75a874a5d213

版权声明:著作权归作者所有。

相关推荐

C#给文档注释添加换行

错误用法:使用<br />/// 第一行 /// <br /> /// 第二行 显示出来没有效果。正确做法:使用<para>/// <summary> /// <para>第一行</para> /// <para>第二行</par

html给文本输入框添加自定义的清除按钮

使用HTML 5,如果对清除按钮的样式不介意的话,可以使用search类型的输入框,它会提供一个默认的清除按钮<input type="search" placeholder="搜索" /> 如果想自定义清除按钮,则需要自己实现,这里使用jquery给出一个实现的方案:<!DOCTYPE h

Android使用DiffUtil智能地更新RecyclerView

DiffUtil是一个工具类,它会找出两个列表的差异,输出一个更新列表,并且可以用来通知RecyclerView的Adapter更新。使用DiffUtil会使用DiffUtil.Callback来计算两个列表的差异,其中DiffUtil.Callback是一个抽象类,需要我们实现它,它包含了四个抽象方法和一个非抽象方法:getOldListSize():获取旧列表的大小getNewListSize

Java 8使用Collectors.partitioningBy分割列表

有这样一个集合:List<Integer> integers = [ 1,2,3,4,5,6,7,8,9] 现在需要把集合按奇偶数分割为两个列表。这种情况下,我们可以使用Collectors.partitioningBy来分割:Map<Boolean, List<Integer>> map =

RecyclerView添加点击事件监听器

实现RecyclerView.OnItemTouchListener的项目触摸监听器:import android.content.Context; import android.support.v7.widget.RecyclerView; import android.view.GestureDetector; import android.view.M

Python字典列表按字典的键值排序

列表list_to_be_sorted = [{'name':'Jack', 'age':39}, {'name':'Bob', 'age':10}] 对列表按name的值排序得到:list_to_be_sorted = [{'name':'Bob', 'age':39}, {'name':'Jack',&n