东莞做网站最好有哪些公司,58推广网站建设有用吗,一个后台可以做几个网站,武进网站建设要多少钱零、本文主题 本文要解决的问题#xff1a; 1. Recyclerview 动画的实现原理是什么#xff1f; 2. 处理的主要流程大概是怎样的#xff1f; 一、核心原理
我们抛开代码#xff0c;想一下#xff0c;RecyclerView中的view动画有几种#xff1f; 添加一个view#xff1a;…零、本文主题 本文要解决的问题 1. Recyclerview 动画的实现原理是什么 2. 处理的主要流程大概是怎样的 一、核心原理
我们抛开代码想一下RecyclerView中的view动画有几种 添加一个view添加的View 显示出来它下面的所有view向下移动一格距离 删除一个view删除的View 渐隐掉它下面的所有view向上移动一格距离 上下滑动所有子view上下滑动 移动…
归纳起来最终实现动画的时候无外乎会执行几个操作 添加或删除View的 透明度动画 0-1 或 1-0 子view的y轴坐标由动画前的位置滑动到 动画后的位置我们暂时只讨论常见的竖向布局 所以看似复杂的RecyclerView动画处理经过分解后其实就是一个view的简单动画没有任何新奇的玩意或算法。 所有需要做的就是记录下动画执行前view的状态透明度y坐标以及计算出动画的目的地透明度y坐标然后执行动画仅此而已这就是RecyclerView动画实现的核心原理。 二、源码分析 - 主流程
经过上面的分析其实我们的重点变成了view数据的组织与记录动画前view的数据的计算动画后心里要有这个数。 然后我们大概看一下整个流程
2.1 最终执行动画的
核心接口RecyclerView.ItemAnimator 核心实现类DefaultItemAnimator 核心实现方法DefaultItemAnimator.runPendingAnimations()
调用栈如下 DefaultItemAnimator.runPendingAnimations() — 核心方法 | RecyclerView.mItemAnimatorRunner | RecyclerView.postAnimationRunner() | ViewInfoStore.ProcessCallback | ViewInfoStore.process(ProcessCallback callback) | RecyclerView.dispatchLayoutStep3() 触发动画的根 RecyclerView.java
private void dispatchLayoutStep3() {......// Step 4: Process view info lists and trigger animationsmViewInfoStore.process(mViewInfoProcessCallback);
}2.2 动画信息存储
核心类ViewInfoStore 核心数据结构mLayoutHolderMap
final SimpleArrayMapRecyclerView.ViewHolder, InfoRecord mLayoutHolderMap new SimpleArrayMap();ViewInfoStore这个类抽象了所有的子View的为了运行动画的跟踪信息。 看下mLayoutHolderMapViewHolder就是子view映射了一个InfoRecord
static class InfoRecord {NullableRecyclerView.ItemAnimator.ItemHolderInfo preInfo;NullableRecyclerView.ItemAnimator.ItemHolderInfo postInfo;一目了然preInfo是动画执行前的信息postInfo是动画执行后的信息。
public static class ItemHolderInfo {public int left;public int top;public int right;public int bottom;public int changeFlags;ItemHolderInfo 记录了View的坐标与flag。 推断逻辑 也就是说在2.1最终执行动画前ViewInfoStore中的数据应该是已经准备好的。
2.3 动画执行前view信息保存
核心类ViewInfoStore 核心方法addToPreLayout() 入口RecyclerView.dispatchLayoutStep1()
final ItemHolderInfo animationInfo mItemAnimator.recordPreLayoutInformation(mState, holder,ItemAnimator.buildAdapterChangeFlagsForAnimations(holder),holder.getUnmodifiedPayloads());mViewInfoStore.addToPreLayout(holder, animationInfo);2.4 计算“动画执行后View应该要处于的状态”的信息
核心类ViewInfoStore 核心方法addToPostLayout() 入口RecyclerView.dispatchLayoutStep3()
final ItemHolderInfo animationInfo mItemAnimator.recordPostLayoutInformation(mState, holder);
......
mViewInfoStore.addToPostLayout(holder, animationInfo);以上就是本篇的主要内容了。 以后有时间的话补一下细节流程再更新吧。 /// 三、源码分析 - 细节流程分析