RecyclerView.ItemAnimator实现动画效果

Item动画来源

在RecyclerView的源码中,有一个ItemHolderInfo.java。其源码如下:

RecyclerView.ItemAnimator实现动画效果_第1张图片

ItemHolderInfo主要是用来表示RecyclerView中item的信息。

  • 图中①处表示这个类主要是和实现Item的动画效果有关

  • 图中②处表示开发人员可以继承这个类,并保存额外的Item信息,最终实现更多的动画效果

  • 图中③处表示,开发人员可以复写obtainHolderInfo方法来返回自定义的ItemHolderInfo对象

那这个obtainHolderInfo是在哪里调用的呢?

+

在RecyclerView中搜索obtainHolderInfo方法,只有两个地方调用了obtainHolderInfo方法:

RecyclerView.ItemAnimator实现动画效果_第2张图片

可以看出分别被两个recordXXXLayoutInfomation方法调用,在RecyclerView中再搜索这两个方法,发现他们分别在RecyclerView布局阶段的dispatchLayoutStep1和dispatchLayoutStep3这两个方法调用:

RecyclerView.ItemAnimator实现动画效果_第3张图片

解释说明:

  1. dispatchLayoutStep1中记录的是RecyclerView布局子ItemView之前的信息,因此此时记录的是重新布局之前的ViewHolder信息。

  2. dispatchLayoutStep2方法中会执行具体的布局子ItemView的操作。

  3. dispatchLayoutStep3中再次记录的布局之后新的ViewHolder信息。

并且最终recordPre和recordPost返回的2个自定义ItemHolderInfo都会被保存到ViewInfoStore中。

ViewInfoStore保存preInfo和postInfo

+

其源码如下:

RecyclerView.ItemAnimator实现动画效果_第4张图片

解释说明:

  • 内部维护了一个ArrayMap键值对,key为ViewHolder类型,value为InfoRecord类型。

  • 在InfoRecord中保存了通过preRecord和postRecord传入的自定义ItemHolderInfo对象。

有了preInfopostInfo之后,

这两个对象用来干嘛呢?

+

在ViewInfoStore中还有一个非常重要的方法---process(ProcessCallback, callback),具体如下:

RecyclerView.ItemAnimator实现动画效果_第5张图片

在 RecyclerView.ItemAnimator源码解析 这篇文章中我已经分析过,图中红框中的各个process方法最终会调用开发人员自定义ItemAnimator的各个animate方法。比如animateChange方法中的preLayoutInfo和postLayoutInfo就是在此处设置的,如下所示:

RecyclerView.ItemAnimator实现动画效果_第6张图片

实现自定义动画效果

源码了解了之后,接下来就开始一步步实现动画效果。先看一下最终实现的动画效果,点击RecyclerView中的某一个Item时,被点击的Item会通过自转效果实现刷新操作。如下所示:

RecyclerView.ItemAnimator实现动画效果_第7张图片

1 自定义ItemHolderInfo对象

代码如下:

RecyclerView.ItemAnimator实现动画效果_第8张图片

2 自定义ItemAnimator对象

我直接继承系统自带的DefaultItemAnimator,并分别复写recorPreLayoutInformation和recordPostLayoutInformation方法,如下:

RecyclerView.ItemAnimator实现动画效果_第9张图片

通过调用super方法先将ItemView中的left、right、top、bottom等信息保存到ColorTextInfo中,然后通过getItemHolderInfo方法设置ViewHolder的color和text。该方法代码如下:

RecyclerView.ItemAnimator实现动画效果_第10张图片

最后按照官方的说明,我们需要在自定义ItemAnimator中,复写 obtainHolderInfo方法返回自定义的ItemHolderInfo对象,如下所示:

RecyclerView.ItemAnimator实现动画效果_第11张图片

大功告成!这样就实现了RecyclerView的Item动画效果。

实际上,我们可以在自定义ItemHolderInfo中创建更多的信息,并实现更多的动画效果,具体还要看项目中的需求。完整代码关注公众号,发送私信 "rv2" 获取。

如果你喜欢本文

长按二维码关注

RecyclerView.ItemAnimator实现动画效果_第12张图片

点个赞,证明你还爱我

你可能感兴趣的:(RecyclerView.ItemAnimator实现动画效果)