AnimatedExpandableListView 完全入门:30秒为Android应用加上丝滑展开折叠动画
【免费下载链接】AnimatedExpandableListViewAn extendable, flexible ExpandableListView widget that supports animations.项目地址: https://gitcode.com/gh_mirrors/an/AnimatedExpandableListView
📌AnimatedExpandableListView是一个专为 Android 打造的可展开折叠列表动画控件,它是原生ExpandableListView的增强版:点击分组即可播放丝滑的展开/折叠过渡动画。如果你受够了系统默认"瞬间弹出"的突兀效果,这个开源控件只需 3 步接入,就能让你的应用拥有 App Store 级交互体验。
为什么需要这个展开折叠动画控件?
Android 原生的ExpandableListView功能强大,但有个明显的短板:展开和折叠没有任何过渡动画——子项要么瞬间出现,要么瞬间消失,观感非常生硬。
AnimatedExpandableListView 正是为解决这个问题而生。它在完全保留原生ExpandableListView用法的基础上,额外提供了两个带动画的方法,让列表的展开折叠动画变得平滑自然,整个过程仅需约 300 毫秒。
30秒上手:3步接入步骤
第1步:获取项目源码
在终端中执行以下命令克隆仓库:
git clone https://gitcode.com/gh_mirrors/an/AnimatedExpandableListView将核心控件源码复制到你的项目中,核心文件只有一个:
- 控件源码:
src/com/idunnololz/widgets/AnimatedExpandableListView.java
第2步:在布局文件中替换控件
打开布局 XML,把原来的<ExpandableListView>直接换成带包名的自定义控件即可,属性写法完全不变。可以参考示例布局res/layout/activity_main.xml,核心就是一行标签:
<com.idunnololz.widgets.AnimatedExpandableListView android:id="@+id/listView" android:layout_width="match_parent" android:layout_height="match_parent" />分组行和子项行的样式分别由res/layout/group_item.xml与res/layout/list_item.xml定义,你可以随意改成自己的 UI。
第3步:让 Adapter 继承专用基类
这一步是关键:你的列表适配器必须继承AnimatedExpandableListAdapter(它是AnimatedExpandableListView内部定义的静态抽象类,位于 src/com/idunnololz/widgets/AnimatedExpandableListView.java 中)。
与普通 Adapter 相比,只需把两个方法改个名:
| 原 Adapter 方法 | 改名为 |
|---|---|
getChildView(...) | getRealChildView(...) |
getChildrenCount(...) | getRealChildrenCount(...) |
完整写法可直接参考示例代码:src/com/example/animatedexpandablelistview/MainActivity.java(ExampleAdapter类)。
两个核心方法:展开与折叠动画
给列表绑定了 Adapter 后,只需注册一个分组点击监听,根据当前状态调用对应方法即可——这就是 30 秒内完成全部接入的原因:
| 方法 | 作用 | 源码位置 |
|---|---|---|
expandGroupWithAnimation(int) | 播放展开动画 | AnimatedExpandableListView.java |
collapseGroupWithAnimation(int) | 播放折叠动画 | AnimatedExpandableListView.java |
listView.setOnGroupClickListener(new OnGroupClickListener() { @Override public boolean onGroupClick(ExpandableListView parent, View v, int groupPosition, long id) { if (listView.isGroupExpanded(groupPosition)) { listView.collapseGroupWithAnimation(groupPosition); // 折叠动画 } else { listView.expandGroupWithAnimation(groupPosition); // 展开动画 } return true; } });💡 示例中用 100 个分组、每组最多 100 个子项做了压力测试,可见动画在长列表下依然流畅稳定。
原理速览:300ms 动画是怎么实现的?
🧠 这个控件的巧妙之处在于"借位":
- 调用展开方法后,控件通知 Adapter 进入动画模式,并真正执行
expandGroup刷新列表; - 此时 Adapter 不返回真实的子项视图,而是返回一个占位视图(DummyView),由它负责绘制出所有子项的画面;
- 对这个占位视图做高度从 0 到目标高度的插值动画(时长由
ANIMATION_DURATION = 300毫秒控制,见 AnimatedExpandableListView.java); - 动画结束后退出动画模式,列表刷新为真实视图——用户看到的就是一次完整的展开折叠动画。
折叠动画则是先播放高度归零的过程,结束后再真正调用collapseGroup。控件还做了大量边界处理:分组在屏幕外时自动跳过动画、动画中途反向切换会从中断高度继续、长列表会估算高度避免卡顿。
项目文件结构一览
🗂️ 整个项目非常轻量,核心文件一览:
src/com/idunnololz/widgets/AnimatedExpandableListView.java—— 控件 + Adapter 基类 + 动画实现(全部核心逻辑)src/com/example/animatedexpandablelistview/MainActivity.java—— 完整使用示例res/layout/activity_main.xml—— 布局接入示例res/layout/group_item.xml/res/layout/list_item.xml—— 分组行与子项行样式res/values/、res/values-sw600dp/、res/values-sw720dp-land/—— 多屏幕适配资源AndroidManifest.xml—— 应用配置
常见问题 FAQ
Q:可以用普通的 BaseExpandableListAdapter 吗?A:不行。setAdapter时会强制检查类型,必须继承AnimatedExpandableListAdapter,否则抛出ClassCastException。
Q:动画时长能调整吗?A:可以。时长由源码中的ANIMATION_DURATION常量(默认 300ms)控制,复制源码后自行修改即可。
Q:点击分组没有任何反应?A:确认两点——① Adapter 已继承AnimatedExpandableListAdapter;② 使用了expandGroupWithAnimation/collapseGroupWithAnimation而不是原生的expandGroup/collapseGroup。
Q:适合什么场景?A:设置页、FAQ 帮助、商品分类、目录导航等一切"分组 + 子项"结构的界面,都是 Android 展开折叠动画的理想用武之地。
🎉 总结:AnimatedExpandableListView 用单个 Java 文件就补齐了原生列表控件最缺的一块——展开折叠动画。三步接入、方法改名、监听点击,30 秒让你的 App 交互体验立刻上一个台阶。
【免费下载链接】AnimatedExpandableListViewAn extendable, flexible ExpandableListView widget that supports animations.项目地址: https://gitcode.com/gh_mirrors/an/AnimatedExpandableListView
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考