新闻详情

新闻详情

首页 / 资讯中心 / 详情

Android-ObservableScrollView 支持的控件清单:从 ObservableListView 到 ObservableRecyclerView 的统一滚动监听方案

发布时间:2026/9/25 2:09:43来源:尧图网络
Android-ObservableScrollView 支持的控件清单:从 ObservableListView 到 ObservableRecyclerView 的统一滚动监听方案
移动开发UI组件【免费下载链接】Android-ObservableScrollViewAndroid library to observe scroll events on scrollable views.项目地址https://gitcode.com/gh_mirrors/an/Android-ObservableScrollView点击查看免费下载本篇技术指南围绕 Android-ObservableScrollView 官方参考文档 docs/reference/supported-widgets.md 展开系统梳理该库中所有可通过Observable前缀命名、并经由Scrollable接口统一操作的滚动控件ListView、ScrollView、WebView、RecyclerView与GridView。读完本文你将清楚每个控件的引入版本、底层实现差异、回调 API 细节以及何时该用本库、何时应直接用官方RecyclerView.OnScrollListener的选型依据。一、命名规则Observable前缀是统一的入口约定Android-ObservableScrollView 的核心设计思想很简单为系统与 support 库中的滚动控件各自派生一个带Observable前缀的子类让原本不可观察的滚动事件变成可观察、可回调的状态流。原文档给出的一一对应关系如下原始控件库中对应控件引入版本备注ListViewObservableListViewv1.0.0首个版本即支持ScrollViewObservableScrollViewv1.0.0首个版本即支持WebViewObservableWebViewv1.0.0首个版本即支持RecyclerViewObservableRecyclerViewv1.1.0支持存在但 RecyclerView 本身已通过OnScrollListener提供滚动状态与位置若无特殊理由应优先使用官方监听器GridViewObservableGridViewv1.2.0最后一个加入的控件其中 v1.1.0 增加RecyclerView支持、v1.2.0 增加GridView支持的版本演进与仓库中的 docs/reference/release-notes.md 记录一致。二、Scrollable接口五种控件共用的统一操作契约所有Observable*控件都实现同一个接口 Scrollable.java。这意味着你可以在代码中以接口类型持有任意控件无需关心具体是ObservableListView还是ObservableScrollView。接口定义如下public interface Scrollable { // 设置单个回调监听器已废弃自 1.7.0 起推荐使用 add/remove Deprecated void setScrollViewCallbacks(ObservableScrollViewCallbacks listener); // 添加一个回调监听器1.7.0 void addScrollViewCallbacks(ObservableScrollViewCallbacks listener); // 移除一个回调监听器1.7.0 void removeScrollViewCallbacks(ObservableScrollViewCallbacks listener); // 清空全部回调监听器1.7.0 void clearScrollViewCallbacks(); // 垂直滚动到指定绝对 Y 位置 void scrollVerticallyTo(int y); // 返回当前滚动位置的 Y 像素值 int getCurrentScrollY(); // 设置触摸事件拦截目标 ViewGroup用于把事件回传给父容器 void setTouchInterceptionViewGroup(ViewGroup viewGroup); }几个关键点值得注意回调可多路分发从源码结构看ObservableListView、ObservableScrollView等实现内部同时维护单一回调字段mCallbacks与回调集合mCallbackCollectionObservableListView.javaaddScrollViewCallbacks加入的多个监听器会在事件发生时被逐一通知这为“同一滚动事件驱动多个 UI 联动”如同时隐藏 ActionBar 与平移 Header提供了支持事件序列保持完整在onTouchEvent的ACTION_MOVE分支中当控件已经滚动到顶部、而父容器需要拦截手势时实现会通过MotionEvent.obtainNoHistory复制事件并修正偏移再以post回投一个ACTION_DOWN给父视图从而维持触摸事件序列的合法性见 ObservableScrollView.java。这正是setTouchInterceptionViewGroup与仓库中TouchInterceptionFrameLayout协作的底层机制samples 下的HandleTouch*Activity系列如 HandleTouchListViewActivity.java展示了完整用法setScrollViewCallbacks已废弃接口上标注了Deprecatedsince 1.7.0起官方推荐使用addScrollViewCallbacks/removeScrollViewCallbacks/clearScrollViewCallbacks三件套。三、五种控件的源码实现差异虽然对外统一但五种控件获取“滚动距离”的方式差异很大这决定了它们各自适用的场景1.ObservableScrollView与ObservableWebView直接改写 onScrollChangedObservableScrollView直接继承ScrollView并重写protected void onScrollChanged(int l, int t, int oldl, int oldt)把系统回调的纵向坐标t直接作为mScrollY分发给回调ObservableScrollView.java。ObservableWebView采用完全相同的策略ObservableWebView.java。因此这两类的getCurrentScrollY()语义最直观——它就是像素级的绝对滚动偏移配合scrollVerticallyTo(int y)内部调用scrollTo(0, y)即可精确控制。2.ObservableListView与ObservableGridView基于 AbsListView 的位置换算ListView/GridView不会向上层报告像素级滚动距离因此ObservableListView继承自ListView和ObservableGridView继承自GridView共 983 行是结构最复杂的实现之一通过注册内部的OnScrollListener在onScroll(firstVisibleItem, ...)回调中自行估算scrollY用SparseIntArray mChildrenHeights按 item 位置缓存子项高度滚动方向变化时累计“已滚过的子项高度总和”加上首个可见子项的getTop()、dividerHeight与paddingTop得到mScrollY见 ObservableListView.java。因此从源码实现可以推断这两类控件的scrollY是估算值当列表项高度不均、且从底部回滚跨越多个 item 时未缓存位置会以首个可见子项高度近似源码注释明确说明了该近似策略。同时要注意ObservableListView重写了setOnScrollListener外部传入的监听器被保存在mOriginalScrollListener中、经由内部mScrollListener代理转发不会丢失既有监听逻辑ObservableListView.java。3.ObservableRecyclerView官方 OnScrollListener 优先ObservableRecyclerView继承自 support-v7 的RecyclerView在类注释中明确写道“Before using this, please consider to use the RecyclerView.OnScrollListener provided by the support library officially.”ObservableRecyclerView.java。这是全库中唯一带官方替代方案的控件support library 自带的RecyclerView.OnScrollListener能直接提供滚动状态SCROLL_STATE_DRAGGING/SETTLING/IDLE与位置信息官方推荐在无特殊理由时优先使用它ObservableRecyclerView的存在意义在于让 RecyclerView 也能融入本库统一的Scrollable回调体系例如复用同一套基于onScrollChanged的 Header/Toolbar 联动逻辑其滚动距离同样基于getChildAdapterPosition(getChildAt(0))与子项高度缓存换算得出见 ObservableRecyclerView.java。四、回调 API 与滚动状态语义ObservableScrollViewCallbacks回调接口所有控件最终都向ObservableScrollViewCallbacks通知事件ObservableScrollViewCallbacks.java方法触发时机参数含义onScrollChanged(int scrollY, boolean firstScroll, boolean dragging)滚动位置变化时scrollY为 Y 轴像素位置firstScroll为同一连串手势中的首次回调dragging为 true 表示手指拖动false 表示惯性滚动onDownMotionEvent()手指按下ACTION_DOWN时无参数适合做手势起始的初始化onUpOrCancelMotionEvent(ScrollState scrollState)拖动结束或取消时scrollState指示最后的滚动方向一个容易被忽视的细节源码注释有专门说明onScrollChanged不会在视图完成首次布局后自动调用因此若依赖它初始化视图位置需要手动触发一次滚动或自行调用初始化逻辑。ScrollState三态枚举ScrollStateScrollState.java定义如下public enum ScrollState { STOP, // 停止但不代表从未滚动过 UP, // 内容向上滚动手指下滑 DOWN, // 内容向下滚动手指上滑 }注意ObservableScrollView的实现刻意不产生STOP其onScrollChanged中只更新UP/DOWN注释解释了原因——Android 4.4 之前onTouchEvent会在ACTION_MOVE时直接调用onScrollChanged若保持STOP状态onUpOrCancelMotionEvent拿到的永远是STOP使该状态失去意义ObservableScrollView.java。因此在消费ScrollState时不要假设所有控件都会产生三种状态。状态保存与恢复五种控件都实现了onSaveInstanceState/onRestoreInstanceState与内部SavedState静态类把mScrollY、mPrevScrollY以及ListView/GridView/RecyclerView 特有的子项高度缓存mChildrenHeights一并写入Parcel确保 Activity 重建后滚动位置与滚动计算状态不丢失见 ObservableListView.java。五、引入依赖与快速上手build.gradle 依赖配置库发布在 Maven Central官方依赖指南见 docs/quick-start/dependencies.mdrepositories { mavenCentral() } dependencies { // 其他依赖省略 compile com.github.ksoichiro:android-observablescrollview:VERSION }将VERSION替换为具体版本号如1.5.0然后点击 Gradle sync 即可。布局与代码的最简用法在布局中直接使用带Observable前缀的类名作为视图标签。以ObservableScrollView为例samples 中的真实布局可参考 samples/res/layout/activity_parallaxtoolbarscrollview.xml、samples/res/layout/activity_actionbarcontrolscrollview.xmlcom.github.ksoichiro.android.observablescrollview.ObservableScrollView android:idid/scroll android:layout_widthmatch_parent android:layout_heightmatch_parent !-- 需要滚动的内容 -- LinearLayout android:layout_widthmatch_parent android:layout_heightwrap_content android:orientationvertical ... /LinearLayout /com.github.ksoichiro.android.observablescrollview.ObservableScrollView在代码中通过Scrollable接口统一注册回调Scrollable scrollable (Scrollable) findViewById(R.id.scroll); scrollable.addScrollViewCallbacks(new ObservableScrollViewCallbacks() { Override public void onScrollChanged(int scrollY, boolean firstScroll, boolean dragging) { // 根据 scrollY 平移 Toolbar / 改变透明度 } Override public void onDownMotionEvent() { // 手势起始 } Override public void onUpOrCancelMotionEvent(ScrollState scrollState) { // 手势结束根据 UP/DOWN 展开或收起 Toolbar } });samples 中每个控件都配有完整的演示ActionBarControl*Activity、ToolbarControl*Activity、ParallaxToolbar*Activity、FillGap*Activity、SlidingUp*Activity、StickyHeader*Activity等位于 samples/src/main/java/com/github/ksoichiro/android/observablescrollview/samples/覆盖五种控件在平移 Toolbar、视差、吸顶 Header、底部上滑等经典交互中的组合方式是快速确认“哪种控件支持哪种效果”的最佳参考。六、选型建议综合原文档与源码选择控件时可遵循以下原则首选ObservableScrollView/ObservableWebView滚动距离精确、实现简单适合内容型页面列表型内容用ObservableListView/ObservableGridView注意其scrollY是依据首个子项高度估算的若列表项高度差异极大联动动画可能出现轻微抖动RecyclerView场景优先考虑官方OnScrollListener原文档明确指出本库对 RecyclerView 的支持只是“存在”官方监听器在滚动状态与位置获取上更标准只有当你想复用本库统一的Scrollable回调体系时才使用ObservableRecyclerView手势联动需求如 SlidingUp 面板、触摸拦截配合TouchInterceptionFrameLayout通过setTouchInterceptionViewGroup指定拦截目标参见 TouchInterceptionFrameLayout.java 与 samples 的HandleTouch*系列。结语Android-ObservableScrollView 通过“Observable前缀子类 Scrollable统一接口”的极简约定把五种 Android 滚动控件收敛到同一套回调模型之下。本文基于 docs/reference/supported-widgets.md 的控件清单结合 library/src/main/java/com/github/ksoichiro/android/observablescrollview/ 下的源码实现为你理清了每个控件的引入版本、底层滚动距离计算方式、回调与状态语义以及 RecyclerView 场景下的官方替代方案。落地实现时建议以 samples 中的 Activity 演示为模板按“控件 → 回调 → 联动动画”的路径逐步搭建。赞分享移动开发UI组件【免费下载链接】Android-ObservableScrollViewAndroid library to observe scroll events on scrollable views.项目地址https://gitcode.com/gh_mirrors/an/Android-ObservableScrollView点击查看免费下载相关推荐Android-ObservableScrollView 使用指南监听滚动事件打造 Material Design 滚动联动效果Android ObservableScrollView 使用指南监听滚动事件打造 Material Design 滚动联动效果 Android Obser移动开发UI组件从TensorFlow到PyTorchMaxViT模型迁移全流程解析从TensorFlow到PyTorchMaxViT模型迁移全流程解析 想要将Google官方TensorFlow训练的MaxViT模型迁移到PyTorch框架Hacktoberfest Checker CI/CD流程GitHub Actions自动化构建与部署Hacktoberfest Checker CI/CD流程GitHub Actions自动化构建与部署 Hacktoberfest Checker是一款帮助开创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

长沙雨花跨境电商招商公司推荐 广受信赖服务商合作实力参考 2026/9/25 2:50:43

长沙雨花跨境电商招商公司推荐 广受信赖服务商合作实力参考

在长沙雨花想做跨境电商创业,不少新手创业者都会纠结几个核心问题,比如本地有没有靠谱的跨境电商招商公司可以合作?怎么判断一家跨境电商招商服务商的实力够不够?想要做跨境电商零基础入门,找专业陪跑孵化服务商到底有没有必要?接下来我们…

阅读更多 →
如何读懂 Obsidian i18n:Babel AST 字符串提取原理完整解析 2026/9/25 2:50:37

如何读懂 Obsidian i18n:Babel AST 字符串提取原理完整解析

如何读懂 Obsidian i18n:Babel AST 字符串提取原理完整解析 【免费下载链接】obsidian-i18n 项目地址: https://gitcode.com/gh_mirrors/ob/obsidian-i18n Obsidian i18n 是一款专为 Obsidian 打造的插件国际化工具,核心能力是 Babel AST 字符串…

阅读更多 →
SPL 到 APL 迁移测试指南:基于 sample-http-logs 与 otel-demo-traces 的 9 组逐行对照用例 2026/9/25 2:50:31

SPL 到 APL 迁移测试指南:基于 sample-http-logs 与 otel-demo-traces 的 9 组逐行对照用例

后端前端AI 技能AI 插件搜索引擎 【免费下载链接】clawhub Skill Plugin Registry for OpenClaw 项目地址: https://gitcode.com/gh_mirrors/mo/clawhub 点击查看 免费下载 本篇指南以 clawhub 仓库中 spl-to-apl 技能的测试查询文档为主体,系统梳理从…

阅读更多 →
Yii 2 类自动加载机制完全指南:PSR-4、类映射表与 Composer 协同实战 2026/9/25 2:50:31

Yii 2 类自动加载机制完全指南:PSR-4、类映射表与 Composer 协同实战

后端Web框架 【免费下载链接】yii2 Yii 2: The Fast, Secure and Professional PHP Framework 项目地址: https://gitcode.com/gh_mirrors/yi/yii2 点击查看 免费下载 Yii 2 内置了一套高性能、完全兼容 PSR-4 标准的类自动加载器,它会在引入框架文件 Y…

阅读更多 →
Apache DataFusion 中的 Arrow 入门:RecordBatch、ArrayRef 与列式执行原理详解 2026/9/25 2:50:25

Apache DataFusion 中的 Arrow 入门:RecordBatch、ArrayRef 与列式执行原理详解

大数据数据分析后端 【免费下载链接】datafusion Apache DataFusion SQL Query Engine 项目地址: https://gitcode.com/gh_mirrors/datafu/datafusion 点击查看 免费下载 导读 Apache DataFusion 将 Apache Arrow 作为其原生内存数据格式,因此任何使用…

阅读更多 →
Artillery 自定义插件开发实战:以 artillery-plugin-hello-world 为例剖析插件接口与扩展机制 2026/9/25 2:50:25

Artillery 自定义插件开发实战:以 artillery-plugin-hello-world 为例剖析插件接口与扩展机制

性能测试接口测试CLI 【免费下载链接】artillery The complete load testing platform. Everything you need for production-grade load tests. Serverless & distributed. Load test with Playwright. Load test HTTP APIs, GraphQL, WebSocket, and more. Use any Node.…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉