这篇文章将向大家展示如何自定义RecyclerView.ItemAnimator
,前面我们已经分析过系统的DefaultItemAnimator
是如何实现的(自定义RecyclerView.ItemAnimator
其实很简单(上)),这篇文章也是基于此实现的,所以没看过的小伙伴,可以先看一下。首先,我们来看一下效果(旋转跳跃我闭着眼...)。
现在看下使用方法,只需要继承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
代码结合查看。