资讯动态

RecyclerView Animators 实战指南:为 Android RecyclerView 接入 ItemAnimator 与 Adapter 动画

发布时间:2026/10/14 1:53:47 来源:尧图企业网站定制
UI组件移动开发【免费下载链接】recyclerview-animatorsAn Android Animation library which easily add itemanimator to RecyclerView items.项目地址https://gitcode.com/gh_mirrors/re/recyclerview-animators点击查看免费下载RecyclerView Animators 是一个开源的 Android 动画库它允许开发者轻松为 RecyclerView 的 item 添加动画。本文将以其官方文档为骨架结合仓库源码Kotlin 版 4.0.x深入讲解两条使用路线基于ItemAnimator的增删移动动画以及基于RecyclerView.Adapter包装器的入场动画。读完本文你将掌握依赖集成、动画器选型、时长/插值器定制、AnimateViewHolder自定义动画与多重动画叠加的完整实战方案。项目概览两大核心能力RecyclerView Animators 的全部能力可归结为两条主线见 README.md 的 Features 一节为 item 的增删Addition/Removal提供ItemAnimator动画——通过替换 RecyclerView 的默认 ItemAnimator让notifyItemInserted、notifyItemRemoved等数据更新自动带上动画效果为 item 的首次出现提供 Adapter 级动画——通过包装RecyclerView.Adapter让列表内容加载时逐项播放入场动画。两条路线互相独立、可组合使用且从 CHANGELOG.md 可以看到Adapter 支持v1.1.0、多重动画叠加v1.2.0、插值器定制v1.1.3/v1.3.0、Motion Delayv2.2.0等功能是随着版本逐步演进而来的。仓库自 4.0.0 起已全面 Kotlin 化minSdkVersion提升至 21、targetSdkVersion/compileSdkVersion为 30见 gradle.properties。快速集成Gradle 依赖配置在模块的build.gradle的dependencies部分添加依赖Kotlin 版本声明dependencies { // Kotlin implementation jp.wasabeef:recyclerview-animators:4.0.2 }同时确保repositories部分不仅包含mavenCentral()还包含指向google()的 maven 仓库repositories { google() mavenCentral() jcenter() }从当前仓库的 animators/build.gradle 可以看到库模块依赖androidx.recyclerview:recyclerview:1.1.0与 Kotlin 标准库ArtifactId 为recyclerview-animators、groupId 为jp.wasabeef工程级配置gradle.properties中VERSION_NAME4.0.1、MIN_SDK_VERSION21且已启用 AndroidXandroid.useAndroidXtrue与 Jetifier 关闭android.enableJetifierfalse集成前请确认你的工程同样开启了 AndroidX。方式一基于 ItemAnimator 的增删移动动画Step 1为 RecyclerView 设置 ItemAnimator拿到 RecyclerView 后直接给itemAnimator属性赋值一个动画器即可val recyclerView findViewByIdRecyclerView(R.id.list) recyclerView.itemAnimator SlideInLeftAnimator()所有动画器都支持通过构造函数传入插值器例如配合回弹感更强的OvershootInterpolatorval recyclerView findViewByIdRecyclerView(R.id.list) recyclerView.itemAnimator SlideInUpAnimator(OvershootInterpolator(1f))这里1f是OvershootInterpolator的 tension张力参数数值越大越过目标位置的幅度越明显仓库中OvershootInLeftAnimator/OvershootInRightAnimator默认张力为2.0f见 OvershootInLeftAnimator.kt。Step 2用 notifyItemXxx 触发动画设置好 ItemAnimator 后数据变化时请使用以下任一方法通知 RecyclerViewnotifyItemChanged(int)notifyItemInserted(int)notifyItemRemoved(int)notifyItemRangeChanged(int, int)notifyItemRangeInserted(int, int)notifyItemRangeRemoved(int, int)重要提示不要依赖notifyDataSetChanged()来触发动画。这是 RecyclerView 的默认行为——该方法内部不会启动任何动画。典型的增删操作写法fun remove(position: Int) { dataSet.removeAt(position) notifyItemRemoved(position) } fun add(text: String, position: Int) { dataSet.add(position, text) notifyItemInserted(position) }仓库的示例工程 MainAdapter.kt 正是采用这一模式remove(position)内先删除dataSet元素再调用notifyItemRemoved(position)add(text, position)内先插入数据再调用notifyItemInserted(position)。Advanced Step 3自定义动画时长动画器内置了四段时长属性可直接通过itemAnimator修改recyclerView.itemAnimator?.apply { addDuration 1000 removeDuration 100 moveDuration 1000 changeDuration 100 }这四者分别控制新增、移除、移动position 变化与内容变更动画的时长。从源码看BaseItemAnimator.kt 中每个具体的 Animator 在animateAddImpl/animateRemoveImpl中都会引用addDuration/removeDuration并且还会根据 item 位置计算级联延迟getAddDelay(holder)返回abs(holder.adapterPosition * addDuration / 4)、getRemoveDelay(holder)返回abs(holder.oldPosition * removeDuration / 4)——这意味着列表越靠后的 item 动画启动越晚形成自然的水波式级联效果。Advanced Step 4更换插值器除了构造函数传参也可以在赋值后通过setInterpolator调整recyclerView.itemAnimator SlideInLeftAnimator().apply { setInterpolator(OvershootInterpolator()) }BaseItemAnimator的默认插值器是DecelerateInterpolatorBaseItemAnimator.kt 中protected var interpolator: Interpolator DecelerateInterpolator()替换为OvershootInterpolator、LinearOutSlowInInterpolator等即可获得不同的节奏感。Advanced Step 5实现 AnimateViewHolder 定制动画如果希望针对不同 ViewHolder 覆盖预设动画可以让 ViewHolder 实现AnimateViewHolder接口定义见 AnimateViewHolder.kt重写添加/移除动画的前置设置与播放逻辑class MyViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView), AnimateViewHolder { override fun preAnimateRemoveImpl(holder: RecyclerView.ViewHolder) { // do something } override fun animateRemoveImpl(holder: RecyclerView.ViewHolder, listener: ViewPropertyAnimatorListener) { itemView.animate().apply { translationY(-itemView.height * 0.3f) alpha(0f) duration 300 setListener(listener) }.start() } override fun preAnimateAddImpl(holder: RecyclerView.ViewHolder) { itemView.setTranslationY(-itemView.height * 0.3f) itemView.setAlpha(0f) } override fun animateAddImpl(holder: RecyclerView.ViewHolder, listener: ViewPropertyAnimatorListener) { itemView.animate().apply { translationY(0f) alpha(1f) duration 300 setListener(listener) }.start() } }这里接口只声明四个方法preAnimateAddImpl/preAnimateRemoveImpl用于在动画开始前把视图置为初始状态animateAddImpl/animateRemoveImpl用于播放具体动画并把listener挂到动画上。从源码调用链BaseItemAnimator.kt 的doAnimateRemove/doAnimateAdd可以确认当holder is AnimateViewHolder时框架会优先调用 ViewHolder 自身的实现否则回退到各 Animator 内置的animateRemoveImpl/animateAddImpl。动画器全览仓库共提供 21 种现成动画器按视觉效果分为五类Cool酷炫LandingAnimatorLandingAnimator.kt 的入场效果是从alpha0、scaleX/scaleY1.5收缩淡入到正常状态出场则是放大到 1.5 倍并淡出模拟着陆的冲击感。Scale缩放ScaleInAnimator,ScaleInTopAnimator,ScaleInBottomAnimator,ScaleInLeftAnimator,ScaleInRightAnimator基础的 ScaleInAnimator.kt 从scaleX/scaleY0放大到 1方向变体通过调整缩放轴心pivot实现例如 ScaleInTopAnimator.kt 把pivotY设为 0从顶部展开ScaleInLeftAnimator.kt 把pivotX设为 0从左侧展开。Fade淡入FadeInAnimator,FadeInDownAnimator,FadeInUpAnimator,FadeInLeftAnimator,FadeInRightAnimatorFadeInAnimator.kt 仅做透明度动画方向变体在淡入的同时沿对应方向位移四分之一自身高度/屏幕宽度如 FadeInDownAnimator.kt 使用translationY -itemView.height * 0.25fFadeInLeftAnimator.kt 使用translationX -rootView.width * 0.25f。Flip翻转FlipInTopXAnimator,FlipInBottomXAnimator,FlipInLeftYAnimator,FlipInRightYAnimator绕 X 轴或 Y 轴旋转 90° 复位。以 FlipInTopXAnimator.kt 为例入场时rotationX从 90° 回到 0°出场则转到 90°FlipInBottomXAnimator.kt 方向相反从 -90° 起始。Slide滑入SlideInLeftAnimator,SlideInRightAnimator,OvershootInLeftAnimator,OvershootInRightAnimator,SlideInUpAnimator,SlideInDownAnimatorSlideInLeftAnimator.kt 入场时把translationX设为-rootView.width从屏幕左侧外滑入OvershootIn*系列在此基础上强制使用OvershootInterpolator(tension)获得越界回弹效果见 OvershootInLeftAnimator.ktSlideInUpAnimator/SlideInDownAnimator则沿垂直方向滑入并伴随透明度变化。方式二基于 RecyclerView.Adapter 的出现动画如果希望列表 item 在初次加载/滚动出现时播放动画而非数据增删可以改用 Adapter 包装方案。Step 1包装 Adapter直接以动画 Adapter 替换普通 Adapter 即可val recyclerView findViewByIdRecyclerView(R.id.list) recyclerView.adapter AlphaInAnimationAdapter(MyAdapter())Java 写法RecyclerView recyclerView findViewById(R.id.list); recyclerView.setAdapter(new AlphaInAnimationAdapter(MyAdapter());Advanced Step 2定制时长、插值器与首屏模式recyclerView.adapter AlphaInAnimationAdapter(MyAdapter()).apply { // Change the durations. setDuration(1000) // Change the interpolator. setInterpolator(vershootInterpolator()) // Disable the first scroll mode. setFirstOnly(false) }Java 写法AlphaInAnimationAdapter alphaInAnimationAdapter new AlphaInAnimationAdapter(new MyAdapter()); alphaInAnimationAdapter.setDuration(1000); alphaInAnimationAdapter.setInterpolator(new OvershootInterpolator()); alphaInAnimationAdapter.setFirstOnly(false);这三个配置项的含义可以从 AnimationAdapter.kt 的源码得到精确解释setDuration(int)动画时长默认300mssetInterpolator(Interpolator)插值器默认LinearInterpolatorsetFirstOnly(boolean)是否只在首次显示时播放动画默认true。从onBindViewHolder的实现可以看出当isFirstOnly为 true 且adapterPosition lastPosition即滚动回已经出现过的位置时会直接调用ViewHelper.clear重置视图而不播放动画为 false 时则每次绑定都播放。另外还有setStartPosition(int)可设置动画从哪个位置开始记录。当出现动画播放时框架会把duration与interpolator应用到每个ObjectAnimator上。Advanced Step 3多重动画叠加动画 Adapter 本身就是普通 Adapter因此可以互相嵌套实现多重动画同时播放val alphaAdapter AlphaInAnimationAdapter(MyAdapter()) recyclerView.adapter ScaleInAnimationAdapter(alphaAdapter)Java 写法recyclerView.setAdapter(new ScaleInAnimationAdapter(alphaInAnimationAdapter));例如先让 item 从透明渐变出现再叠加缩放效果。在 AnimationAdapter.kt 的getAnimators抽象方法中可以看到每个动画 Adapter 通过返回一个Animator数组来声明自己的动画这从机制上保证了多 Adapter 嵌套时动画可以共存。Adapters 一览AlphaAlphaInAnimationAdapterScaleScaleInAnimationAdapterSlideSlideInBottomAnimationAdapter、SlideInRightAnimationAdapter、SlideInLeftAnimationAdapter从源码可以看到各实现的具体动画AlphaInAnimationAdapter.kt 通过ObjectAnimator.ofFloat(view, alpha, from, 1f)实现透明度渐变默认起点from0f构造函数第二个参数可自定义起点ScaleInAnimationAdapter.kt 同时动画scaleX与scaleY默认起点0.5fSlideInLeftAnimationAdapter.kt 从translationX -rootView.width滑入SlideInRightAnimationAdapter.kt 从rootView.width滑入SlideInBottomAnimationAdapter.kt 从translationY measuredHeight从底部滑入。源码剖析动画如何被调度执行无论哪条路线核心调度都在 BaseItemAnimator.kt继承SimpleItemAnimator中完成。它内部维护了pendingRemovals、pendingAdditions、pendingMoves、pendingChanges四个待处理队列以及对应的四组运行中列表runPendingAnimations()按照先移除 → 再移动 → 变更与移动并行 → 最后添加的顺序调度并允许通过postOnAnimationDelayed让后置动画等待前置动画如移除动画完成再启动。值得注意的两个实现细节属性清理所有动画结束或取消时都会调用 ViewHelper.kt 的clear()把alpha、scaleX/Y、translationX/Y、rotationX/Y重置回默认值、pivot 恢复到视图中心并清掉startDelay与插值器避免动画残留污染后续状态supportsChangeAnimations false基类在init中关闭了默认的变更动画支持animateChange在同 ViewHolder 复用场景下回退为移动动画从而规避常见的item 内容变化时旧 View 卡住问题。示例工程 MyAnimator.kt 展示了如何用继承扩展一个自定义动画器ScaleInRightAnimatorLinearOutSlowInInterpolatorMyAnimationAdapter.kt 则演示了如何继承AlphaInAnimationAdapter并自定义from起点——这说明两条路线都具备良好的扩展性。综合实战示例工程演示仓库的 example 模块提供了两个可直接运行的演示页面AnimatorSampleActivity.kt通过 Spinner 在 21 种BaseItemAnimator含FadeInAnimator、LandingAnimator、ScaleInAnimator、FlipInTopXAnimator、SlideInLeftAnimator、OvershootInLeftAnimator(1.0f)等之间动态切换recyclerView.itemAnimator并设置了addDuration500、removeDuration500同时提供新增 itemadapter.add(...)内部调notifyItemInserted与删除 itemadapter.remove(...)内部调notifyItemRemoved两个操作按钮AdapterSampleActivity.kt通过 Spinner 在AlphaInAnimationAdapter、ScaleInAnimationAdapter、SlideInBottomAnimationAdapter等五种动画 Adapter 间切换并统一调用setFirstOnly(true)、setDuration(500)、setInterpolator(OvershootInterpolator(.5f))。两个页面都支持通过 MainActivity.kt 的开关在GridLayoutManager(context, 2)与LinearLayoutManager(context)之间切换验证动画在列表与网格布局下的表现。常见问题与最佳实践动画不生效确认使用的是notifyItemInserted/Removed等逐条通知而非notifyDataSetChanged()——后者不会触发 ItemAnimator。滚动时动画乱跳Adapter 路线默认setFirstOnly(true)如需每次出现都播放请显式调用setFirstOnly(false)同时注意lastPosition只增不减回滚到已出现位置不会重复播放。级联延迟getAddDelay/getRemoveDelay按位置线性放大延迟如果列表很长末尾 item 可能明显滞后可通过缩短addDuration/removeDuration缓解。自定义动画记得复用 listener实现AnimateViewHolder时animateAddImpl/animateRemoveImpl收到的listenerDefaultAddAnimatorListener/DefaultRemoveAnimatorListener负责dispatchAddFinished等收尾工作务必setListener(listener)否则动画完成后框架无法得知并可能造成状态滞留。版本兼容当前仓库 4.0.x 要求 minSdk 21、基于 AndroidXrecyclerview 1.1.0老项目如未迁移 AndroidX 需评估后再引入。结语RecyclerView Animators 通过精心设计的BaseItemAnimator基类与AnimationAdapter包装器把增删移动动画与入场动画两大高频需求封装成了开箱即用的组件。配合 21 种预设动画器、可配置的时长/插值器/级联延迟以及AnimateViewHolder扩展点你可以在不改动业务 Adapter 的前提下为列表交互注入完整、细腻的动效体验。更多细节可继续阅读 README.md、CHANGELOG.md 与animators/模块源码。赞分享UI组件移动开发【免费下载链接】recyclerview-animatorsAn Android Animation library which easily add itemanimator to RecyclerView items.项目地址https://gitcode.com/gh_mirrors/re/recyclerview-animators点击查看免费下载相关推荐RAGatouille索引管理如何高效构建、更新和查询文档库RAGatouille索引管理如何高效构建、更新和查询文档库 RAGatouille是一款基于ColBERT技术的高效检索工具能够帮助用户轻松构建、更新和查人工智能RAGNLP深度学习终极指南如何自定义Android RecyclerView ItemAnimator动画扩展终极指南如何自定义Android RecyclerView ItemAnimator动画扩展 Android Advanced RecyclerView库为R移动开发UI组件如何让Android列表动起来RecyclerView Animators动画库的终极指南如何让Android列表动起来RecyclerView Animators动画库的终极指南 想要为你的Android应用添加酷炫的列表动画效果吗RecyclUI组件移动开发上一篇Qwen-Image-Edit-Rapid-AIO未来展望从图像编辑工具到完整创作平台的演进下一篇数据处理与存储从文件到数据库的完整流程创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑