自定义RecyclerView.ItemAnimator其实很简单(下)

这篇文章将向大家展示如何自定义RecyclerView.ItemAnimator,前面我们已经分析过系统的DefaultItemAnimator是如何实现的(自定义RecyclerView.ItemAnimator其实很简单(上)),这篇文章也是基于此实现的,所以没看过的小伙伴,可以先看一下。首先,我们来看一下效果(旋转跳跃我闭着眼...)。

自定义RecyclerView.ItemAnimator其实很简单(下)_第1张图片
a.gif

现在看下使用方法,只需要继承BaseItemAnimator,然后实现对应的抽象方法即可。我们先来定义一个类FadeItemAnimator继承BaseItemAnimator,实现系统自带的DefaultItemAnimator的效果。代码如下所示。注释什么很清晰,通过注释就可以明白每个方法的作用了。这里需要注意的地方是不能为动画设置自己想要的动画时间,要调用getChangeDuration()getAddDuration()getChangeDuration()来设置动画时间或者延时,这样才能够保持应用RecyclerView.ItemAnimator动画时间的一致性。所以当设置的时间后,为了保持动画一致性,还是会在BaseItemAnimator重新设置为对应的RecyclerView.ItemAnimator动画时间

package com.ivy.recyclerviewitemanimator;

import android.support.v4.animation.AnimatorCompatHelper;
import android.support.v4.view.ViewCompat;
import android.support.v4.view.ViewPropertyAnimatorCompat;
import android.support.v7.widget.RecyclerView;

/**
 * Created by ivy on 2017/3/22.
 * Description:
 */

public class FadeItemAnimator extends BaseItemAnimator {
    /**
     * 执行移除动画
     * @param holder 被移除的ViewHolder
     * @param animator 被移动的ViewHolder对应动画对象
     */
    @Override
    public void setRemoveAnimation(RecyclerView.ViewHolder holder,ViewPropertyAnimatorCompat animator) {
        animator.alpha(0);
    }

    /**
     * 执行移除动画结束,执行还原,因为该ViewHolder会被复用
     * @param view 被移除的ViewHolder
     */
    @Override
    public void removeAnimationEnd(RecyclerView.ViewHolder view) {
        ViewCompat.setAlpha(view.itemView,1);
    }

    /**
     * 执行添加动画初始化 这里设置透明为0添加时就会有渐变效果当然你可以在执行动画代码之前执行
     * @param holder 添加的ViewHolder
     */
    @Override
    public void addAnimationInit(RecyclerView.ViewHolder holder) {
        ViewCompat.setAlpha(holder.itemView, 0);
    }

    /**
     * 执行添加动画
     * @param holder 添加的ViewHolder
     * @param animator 添加的ViewHolder对应动画对象
     */
    @Override
    public void setAddAnimation(RecyclerView.ViewHolder holder,ViewPropertyAnimatorCompat animator) {
        animator.alpha(1);
    }

    /**
     * 取消添加还原状态以复用
     * @param holder 添加的ViewHolder
     */
    @Override
    public void addAnimationCancel(RecyclerView.ViewHolder holder) {
        ViewCompat.setAlpha(holder.itemView, 1);
    }

    /**
     * 更新时旧的ViewHolder动画
     * @param holder 旧的ViewHolder
     * @param animator ViewHolder对应动画对象
     */
    @Override
    public void setOldChangeAnimation(RecyclerView.ViewHolder holder, ViewPropertyAnimatorCompat animator) {
        animator.alpha(0);
    }

    /**
     * 更新时旧的ViewHolder动画结束,执行还原
     * @param holder
     */
    @Override
    public void oldChangeAnimationEnd(RecyclerView.ViewHolder holder) {
        ViewCompat.setAlpha(holder.itemView,1);
    }

    /**
     * 更新时新的ViewHolder初始化
     * @param holder 更新时新的ViewHolder
     */
    @Override
    public void newChangeAnimationInit(RecyclerView.ViewHolder holder) {
        ViewCompat.setAlpha(holder.itemView,0);
    }

    /**
     * 更新时新的ViewHolder动画
     * @param holder 新的ViewHolder
     * @param animator ViewHolder对应动画对象
     */
    @Override
    public void setNewChangeAnimation(RecyclerView.ViewHolder holder, ViewPropertyAnimatorCompat animator) {
        animator.alpha(1);
    }

    /**
     * 更新时新的ViewHolder动画结束,执行还原
     * @param holder
     */
    @Override
    public void newChangeAnimationEnd(RecyclerView.ViewHolder holder) {
        ViewCompat.setAlpha(holder.itemView,1);
    }
}

是不是很简单?只要针对每个状态的初始、开始、结束状态进行简单的动画和属性设置就可以了。
所以,我们只需要直接继承BaseItemAnimator就可以很简单的自定义RecyclerView.ItemAnimator

那么我对BaseItemAnimator这个类做了什么?其实也很简单,只是把DefaultItemAnimator中关于动画的初始、开始、结束状态的动画和属性设置处抽取了抽象方法而已,其它的动画等待、执行、移除、还原、让位移动逻辑都是适用任何动画的。大家可以直接根据上篇对DefaultItemAnimator的分析以及BaseItemAnimator代码结合查看。

源码戳我

你可能感兴趣的:(自定义RecyclerView.ItemAnimator其实很简单(下))