RecyclerView
的强大之处相信大家已经体验到了,在上一篇RecyclerView详解 —— 自定义分割线我们学习了如何定义分割线,本篇将介绍如何自定义动画。
Google为我们提供了一个默认的动画实现(DefaultItemAnimator
),当数据添加、删除、更新时,会触发默认的动画效果:
通过本篇的学习,我们可以得到下面的效果:
如果觉得自定义比较繁琐,Github上也有相关的动画实现:https://github.com/wasabeef/recyclerview-animators
接下来我们将一步步分析这个实现类,最后在它的基础上修改默认的动画效果。
先来看DefaultItemAnimator
中的几个重要的方法:
void runPendingAnimations()
:当有动画需要执行时调用。boolean isRunning()
:返回当前是否有动画正在运行。boolean animateAdd()
:添加元素时调用,通常返回true。boolean animateRemove()
:移除数据时调用。boolean animateMove()
:列表项位置移动时调用。boolean animateChange()
:列表项数据发生改变时调用。void endAnimation()
:当某个动画需要被立即停止时调用,这里一般做视图的状态恢复。void endAnimations()
作用同上,区别是停止多个动画时调用。
认识了八个主要的方法,我们再来看看具体的动画是如何实现的,我们从添加元素动画开始(其他动画的运行流程基本类似),当有新的元素添加进来时,首先调用animateAdd(ViewHolder holder)
:
@Override
public boolean animateAdd(final ViewHolder holder) {
resetAnimation(holder); // 该方法最终会调用endAnimation()
ViewCompat.setAlpha(holder.itemView, 0);
mPendingAdditions.add(holder);
return true;
}
开始动画之前需要取消之前正在播放的动画,同时将Item的状态设置为动画的终结状态:
@Override
public void endAnimation(ViewHolder item) {
// 省略部分代码...
// 遍历添加动画的队列,逐个移除队列,同时恢复Item的状态
for (int i = mAdditionsList.size() -