添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
相关文章推荐
讲道义的鞭炮  ·  springboot mongodb ...·  4 月前    · 
不拘小节的羽毛球  ·  android ...·  1 年前    · 
干练的滑板  ·  moviepy ...·  1 年前    · 
本文深入探讨了RecyclerView动画的实现原理,包括初始化、添加、移除、更新数据时的动画效果。通过自定义ItemAnimator,详细解释了如何实现添加、移动ItemView的动画效果,以及如何利用ViewCompat进行兼容性处理。 摘要生成于 ,由 DeepSeek-R1 满血版支持,

Recyclerview animation

什么时候开始的 RecyclerView animation,在我们UI 2.0~3.0的时候,很多地方都需要这种 RecyclerView 界面 初始化 添加 移除 更新 数据的 动画效果样式.

看几个RecycelrView Adapter 初始化的小DEMO
在这里插入图片描述
在这里插入图片描述
除了这种方式进行初始化,我们还可以用前面所讲的过渡动画来进行

Transition explode = new Explode();
explode.setDuration(1000);
TransitionManager.beginDelayedTransition(recyclerView, explode);
if (recyclerView.getAdapter() != null) {
	recyclerView.setAdapter(null);
} else {
	recyclerView.setAdapter(mColorsAdapter);

再看看 RecyclerView Item 添加,移除,更新的的小栗子
在这里插入图片描述

如果没有设置 Item animation,RecyclerView 默认使用的就是 DefaultItemAnimator(继承的 SimpleItemAnimator)

如果想实现上面的一些效果(Demo地址),我们就需要 自定义自己的 Item Animator ,只需要继承 SimpleItemAnimator,重写几个关键的重要函数

函数名含义
animateRemoveitem 移除时的动画
animateAdditem 添加时的动画
animateMove移动时的动画 列表项位置移动时调用
animateChangeitem 更新时的动画
runPendingAnimations真正控制执行动画的地方
endAnimation停止某个Item的动画
endAnimations停止所有动画
isRunning返回当前是否有动画需要执行

在自定义Item Animator 中会调用到的相关函数:

函数名含义
dispatch(Add/Remove/Move/Change)Starting动画开始时调用,比如Add dispatchAddStarting
dispatch(Add/Remove/Move/Change)Finished动画结束时调用,比如Add dispatchAddFinished
dispatchAnimationsFinished所有动画结束时调用

引发 Item 动画的几个函数

Adapter.notifyItemInserted(int position) // 触发 Add Item Animator
Adapter.notifyItemRemoved(int position) // 触发 Remove Item Animator
Adapter.notifyItemChanged(int position) // 触发 Change Item Animator
Adapter.notifyItemMoved(int fromPosition, int  toPosition) // 触发 MoveItem Animator

先来自定义的一个添加Item View的动画效果的小DEMO

public class CumtomAnimator extends SimpleItemAnimator {
	// 保存 需要做 add 动画效果的 itemView 的数组
	private ArrayList<RecyclerView.ViewHolder> mPendingAdditions = new ArrayList<>();
	@Override
    public boolean animateAdd(RecyclerView.ViewHolder holder) {
    	// 添加对应的数据,主要用于 runPendingAnimations 执行动画效果
    	mPendingAdditions.add(holder);
    @Override
    public void runPendingAnimations() {
    	for (RecyclerView.ViewHolder holder : mPendingAdditions) {
            ViewCompat.animate(holder.itemView)
                    .scaleX(1.0f)
                    .scaleY(1.0f)
                    .setDuration(getAddDuration())
                    .start();
        // 记得要清理掉,不然其它动画执行后,要被影响,而且也影响 isRunning 的判断
        mPendingAdditions.clear();
	@Override
    public boolean isRunning() {
        return !mPendingAdditions.isEmpty()
               || ... ...
    ... ...

ViewCompat:android官方实现兼容的一个帮助类,具体可以查找网上相关资料 官方资料

可以试试(notifyItemInserted(position))有没有动画效果,肯定是没有效果的,因为没有去初始化它 起始的样子!!!
在这里插入图片描述

来改改代码… …

... ...
public boolean animateAdd(RecyclerView.ViewHolder holder) {
	// 初始化动画状态
    // 将 ItemView 设置为 ScaleX,ScaleY 都为0
    // 那么执行动画效果的时候,就是从 中间位置 然后 放大 0.0f -> 1.0f
    View itemView = holder.itemView;
    ViewCompat.setPivotY(itemView, itemView.getMeasuredHeight() / 2);
    ViewCompat.setPivotX(itemView, itemView.getMeasuredWidth() / 2);
    ViewCompat.setScaleX(itemView, 0);
    ViewCompat.setScaleY(itemView, 0);
    // 添加对应的数据,主要用于 runPendingAnimations
    mPendingAdditions.add(holder);
... ...

代码修改后,添加 ItemView 就能达到下面的效果。
在这里插入图片描述
你会发现,上面的 RecyclerView ItemView的添加动画效果,还行,就是新增的时候,下面的其它的ItemView 移动的很生硬,所以这里就引出了 animateMove 函数。

函数名参数参数含义
animateMove(final ViewHolder holder, int fromX, int fromY, int toX, int toY)列表项位置移动时调用,移动的ViewHolder;fromX 起始x,y值;toX 目标x,y值
@Override
public boolean animateMove(RecyclerView.ViewHolder holder, int fromX, int fromY, int toX, int toY) {
	// 设置它的初始位置.
	final View view = holder.itemView;
	// 目标的位置 减去 起始位置(原来的位置),得到需要位移的距离
    int deltaX = toX - fromX;
    int deltaY = toY - fromY;
    // 设置后,相当于从 新的位置 回到了 原来的位置上.
    if (deltaX != 0) {
       ViewCompat.setTranslationX(view, -deltaX);
    if (deltaY != 0) {
    	ViewCompat.setTranslationY(view, -deltaY);
    mPendingMoves.add(new MoveInfo(holder, fromX, fromY, toX, toY));
@Override
public void runPendingAnimations() {
    ... ...
    // 最后从原来的位置 做动画,回到新的位置上,就完整了移动的动画效果.
	for (MoveInfo moveInfo : mPendingMoves) {
		ViewCompat.animate(moveInfo.holder.itemView)
                  .translationX(0)
                  .translationY(0)
                  .setDuration(getMoveDuration())
                  .start();
	mPendingMoves.clear();
	... ...

整个添加Item View的动画效果,就这样完成啦!!!
在这里插入图片描述
当然在项目,肯定没有那么简单,这里只是简单的举个小栗子,给大家说明下几个函数的重要性.

如果是项目中使用,只需要继承这个 BaseitemAnimator,写一些自己想要的效果就OK,不过这里已经实现了大多数的动画效果。
在这里插入图片描述 在这里插入图片描述
需要使用以上效果的小伙伴,自行下载,代码库地址
在这里插入图片描述

5.x 参考资料

RecyclerView animations 国外大神文章
RecyclerView anim视频

掌握RecyclerView动画不得不看的文章

谷歌API文档

深入理解 RecyclerView 系列之二:ItemAnimator

自定义RecyclerView ItemAnimator 上

自定义RecyclerView ItemAnimator 下

Android动画了解—转场/过渡(Transition) 动画<=上个章节 下个章节=> Android动画了解—其它动画

RecyclerView的强大之处相信大家已经体验到了,在上一篇RecyclerView详解 —— 自定义分割线我们学习了如何定义分割线,本篇将带领大家走进RecyclerView动画世界。Google为我们提供了一个默认的动画实现,当数据添加、删除、更新时,会触发默认的动画效果: 接下来我们将一步步分析这个实现类,最后在它的基础上修改默认的动画效果。先来看DefaultItemAnimat
这一篇就实现下面两种效果: 实现之前,就是要对系统为我们实现的DefaultItemAnimator这个类进行改造,自己仿照写一个BaseItemAnimator,再在这个类的基础上,自定义我们自己的各种各样的动画,以add动画改造进行举例,DefaultItemAnimator中关于add动画有两个方法:animateAdd和animateAddImpl @Override public...
RecyclerView item动画 RecyclerView有一个方法 RecyclerView.setItemAnimator( ),这个方法就是添加item动画的,该方法需要一个RecyclerView.ItemAnimator对象。 RecyclerView.ItemAnimator 可以通过实现RecyclerView.ItemAnimator来实现 recyclerView.setItemAnimator(new RecyclerView.ItemAnimator() {
RecyclerView动画RecyclerView Animators是一个Android库,允许开发人员轻松创建带有动画RecyclerView。 请随时使用。 对动画添加和删除 项目的外观动画 ItemAnimator 如何使用? Gradle 在模块的build.gradle文件上,将此实现语句添加到dependencies部分: dependencies { // Kotlin implementation ' jp.wasabeef:recyclerview-animators:4.x.x ' 还要确保repositories部分不仅包括jcenter,而且包括带有"google()"端点的maven部分。 repositories { google() jcenter() ItemAnimator 设置RecyclerView ItemAnimator。 val recyclerView = findViewById < RecyclerView> (R.id.list) recycle
recyclerView1 = findViewById(R.id.recyclerView1); 2.设置为线性布局(这里在linearlayout,gridlayout,StaggeredGridLayout中选一种) recyclerView1.setLayoutManager(new LinearLayoutManager(this)); 3.初始化数据 initData(); 这个方法的具体内容是: RecyclerView作为Android中最重要的一个系统组件,在用户界面展示时就势必要展示其最好的一面(美观、健壮、优化)。本文将通过设置Animation来快速地达到设置各种炫酷的动画效果。 一:基本配置 首先先创建一个RecyclerView示例项目。其工程结构如图所示: Bean.java,BeanAdapter.java,MainActivity.java这三个文件分别代表RecyclerView子项的实体Bean,RecyclerView适配器,主活动。其代码如下: Bean.jav
推荐一个强大且易用的Android动画库:RecyclerView Animators 在移动应用开发中,动效是一个能提升用户体验的重要元素。RecyclerView作为Android的主要列表组件,通过添加适当的动画效果,可以极大地增强其吸引力和交互性。今天,我们要向你推荐一个专为RecyclerView设计的强大动画库——RecyclerView Animators。 1. 项目介绍 Recy...