Android RecyclerView 动画处理 流程 原理(源码分析第二篇)

零、本文主题

本文要解决的问题:
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 SimpleArrayMap<RecyclerView.ViewHolder, InfoRecord> mLayoutHolderMap =new SimpleArrayMap<>();

ViewInfoStore这个类,抽象了所有的子View的(为了运行动画的)跟踪信息。
看下mLayoutHolderMap,ViewHolder就是子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);

以上,就是本篇的主要内容了。


以后有时间的话,补一下细节流程,再更新吧。
/// 三、源码分析 - 细节流程分析

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/215902.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

react Hooks之useLayoutEffect和useInsertionEffect

在介绍这两个hooks之前。让我们先对比一下useEffect、useLayoutEffect、useInsertionEffect 执行时机&#xff1a; useEffect 在组件渲染完成后执行&#xff0c;属于异步执行。useInsertionEffect 在组件渲染并插入 DOM 后执行&#xff0c;也属于异步执行。useLayoutEffect 在组…

互联网公司,哪个部门才是鄙视链最顶端?

文章目录 每日一句正能量前言财务部法务部公关部销售部前台行政IT部创意部后记 每日一句正能量 我们必须在失败中寻找胜利&#xff0c;在绝望中寻求希望。 前言 在互联网公司中&#xff0c;不同职位的鄙视链是存在的。有些职位享有高尚的地位&#xff0c;而有些则被看作是次要…

python 爬虫 m3u8 视频文件 加密解密 整合mp4

文章目录 一、完整代码二、视频分析1. 认识m3u8文件2. 获取密钥&#xff0c;构建解密器3. 下载ts文件4. 合并ts文件为mp4 三、总结 一、完整代码 完整代码如下&#xff1a; import requests import re import os from tqdm import tqdm from Crypto.Cipher import AES# 创建临…

Shopify二次开发之五:元字段(Metafields)

目录 解释 操作 1、添加Custom data 2、选择特定类型的数据 3、为Page配置元子段和值 4、模板访问 解释 Shopify Metafields 是一种用于存储和管理自定义数据的功能。它们允许商户在商城中的产品、订单、客户、Page等对象上添加自定义字段&#xff0c;以满足特定业务需求…

c语言->自定义类型联合体和枚举类型

系列文章目录 文章目录 前言 ✅作者简介&#xff1a;大家好&#xff0c;我是橘橙黄又青&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;橘橙黄又青_C语言,函数,指针-CSDN博客 目的&#xff1a;学习联合体和枚举类型的…

[cleanrl] ppo_continuous_action源码解析

1 import库&#xff08;略&#xff09; import os import random import time from dataclasses import dataclassimport gymnasium as gym import numpy as np import torch import torch.nn as nn import torch.optim as optim import tyro from torch.distributions.normal…

Kubernetes实战(八)-防止k8s namespace被误删除

1 背景 运维新同学在预发环境操作删除pod的时候&#xff0c;不知道什么原因把kubectl delete pod命令敲成了kubectl delete ns pre把预发环境删了&#xff0c;几十个模块&#xff0c;将近一个小时才恢复。幸亏是测试环境啊&#xff0c;如果是生产可以可以跑路了。 2 解决方案…

jsonpath:使用Python处理JSON数据

使用Python处理JSON数据 25.1 JSON简介 25.1.1 什么是JSON JSON全称为JavaScript Object Notation&#xff0c;一般翻译为JS标记&#xff0c;是一种轻量级的数据交换格式。是基于ECMAScript的一个子集&#xff0c;采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清…

java对二维数组进行排序

一、按行排序&#xff1a; 对二维数组按进行排序&#xff0c;直接调用Arrays.sort就行&#xff1a; private static int [][] sortRows(int[][] arr) {//行排序for (int i 0; i < arr.length; i) {Arrays.sort(arr[i]);}return arr;}二、按列排序&#xff1a; 1.使用比较…

计算机网络:应用层(一)

我最近开了几个专栏&#xff0c;诚信互三&#xff01; > |||《算法专栏》&#xff1a;&#xff1a;刷题教程来自网站《代码随想录》。||| > |||《C专栏》&#xff1a;&#xff1a;记录我学习C的经历&#xff0c;看完你一定会有收获。||| > |||《Linux专栏》&#xff1…

鸿蒙开发之状态管理@Observed和@ObjectLink

一、使用场景 当对象内引用对象&#xff0c;改变内部对象属性的时候其他状态管理如State、Provide、Consume等是无法触发更新的。同样&#xff0c;在数组内如果有对象&#xff0c;改变对象的属性也是无法更新的。在这种情况下就可以采用Observed和ObjectLink装饰器了。 二、使…

C# WPF上位机开发(简易图像处理软件)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 图像处理是工业生产重要的环节。不管是定位、测量、检测还是识别&#xff0c;图像处理在工业生产中扮演重要的角色。而c#由于自身快速开发的特点&a…

玩转 Go 语言并发编程:Goroutine 实战指南

一、goroutine 池 本质上是生产者消费者模型在工作中我们通常会使用可以指定启动的 goroutine 数量-worker pool 模式&#xff0c;控制 goroutine 的数量&#xff0c;防止 goroutine 泄漏和暴涨一个简易的 work pool 示例代码如下&#xff1a; package mainimport ("fmt…

小程序跳转tabbar,tabbar页面不刷新

文章地址&#xff1a;12.小程序 之切换到tabBar页面不刷新问题_360问答 解决办法备份&#xff1a; wx.switchTab&#xff1a;跳转到 tabBar 页面&#xff0c;并关闭其他所有非 tabBar 页面 wx.reLaunch&#xff1a;关闭所有页面&#xff0c;打开到应用内的某个页面。 wx.reLa…

解决微信小程序中 ‘nbsp;‘ 空格不生效的问题

在微信小程序开发中&#xff0c;我们经常会使用 来表示一个空格。这是因为在 HTML 中&#xff0c;空格会被解析为一个普通字符&#xff0c;而不会产生实际的空白间距。而 是一种特殊的字符实体&#xff0c;它被解析为一个不可见的空格&#xff0c;可以在页面上产生真正的空…

力扣70. 爬楼梯

动态规划 思路&#xff1a; 使用递归比较容易理解&#xff0c; f(n) f(n - 1) f(n - 2)&#xff1b; 到剩余1级台阶有 f(n - 1)&#xff0c;到剩余2级台阶有 f(n-2)&#xff1b;边界情况是 n 0, f(0) 1n 1, f(1) 1n 2, f(2) 2 递归代码实现&#xff1a; class Soluti…

Axure RP 9 入门教程

1. Axure简介 Axure 是一个交互式原型设计工具&#xff0c;可以帮助用户创建复杂的交互式应用程序和网站。Axure 能够让用户快速构建出具有高度可交互性的原型&#xff0c;可以在团队中进行协作、分享和测试。 使用 Axure 可以设计出各种不同类型的原型&#xff0c;包括网站、移…

系列十五、搭建redis集群

一、概述 上篇文章介绍了redis集群的相关知识&#xff0c;本章实战演示redis的集群环境的详细搭建步骤。如果帮助到了你&#xff0c;请点赞 收藏 关注&#xff01;有疑问的话也可以评论区交流。 二、搭建步骤 2.1、预备知识 判断一个集群中的节点是否可用&#xff0c;是集群…

【SpringBoot篇】详解基于Redis实现短信登录的操作

文章目录 &#x1f970;前言&#x1f6f8;StringRedisTemplate&#x1f339;使用StringRedisTemplate⭐常用的方法 &#x1f6f8;为什么我们要使用Redis代替Session进行登录操作&#x1f386;具体使用✨编写拦截器✨配置拦截器&#x1f33a;基于Redis实现发送手机验证码操作&am…

EarCMS 前台任意文件上传漏洞复现

0x01 产品简介 EarCMS是一个APP内测分发系统的平台。 0x02 漏洞概述 EarCMS前台put_upload.php中,存在pw参数硬编码问题,同时sql语句pdo使用错误,没有有效过滤sql语句,可以控制文件名和后缀,导致可以任意文件上传。 0x03 复现环境 FOFA:app="EearCMS" 0x0…