Android Studio中如何检测NestedScrollView的滚动是否已停止
NestedScrollView滚动停止状态检测方案
原代码问题原因
- 你原有逻辑中的停止判断仅限定了
scrollY == 0的场景,只有滚动到页面最顶部时才会命中该分支,普通位置滚动停止不会触发 OnScrollChangeListener仅在滚动坐标发生变化时回调,滚动停止后坐标无变化,不会触发该监听,因此无法直接在该回调内判断停止状态
可行实现方案
可以通过Handler延迟消息的机制实现停止检测:每次触发滚动事件时,先移除之前待执行的停止检测任务,再发送一个延迟的停止检测任务。如果指定时间内没有新的滚动事件触发,延迟任务就会正常执行,说明滚动已经停止。
实现代码
首先声明全局变量:
// 滚动停止检测延迟时间,单位ms,可根据需求调整,100-300区间都适用 private static final int SCROLL_STOP_DELAY = 200; private Handler scrollStopHandler = new Handler(Looper.getMainLooper()); private Runnable scrollStopRunnable = () -> { // 滚动停止时的逻辑 Toast.makeText(context, "Scrolling Stopped", Toast.LENGTH_SHORT).show(); relativeLayout.setAlpha(1f); };
然后设置滚动监听:
nestedScrollView.setOnScrollChangeListener((NestedScrollView.OnScrollChangeListener) (v, scrollX, scrollY, oldScrollX, oldScrollY) -> { // 每次滚动触发时,先移除待执行的停止任务 scrollStopHandler.removeCallbacks(scrollStopRunnable); if (scrollY > oldScrollY) { // 向下滚动 Toast.makeText(context, "Scrolling Down", Toast.LENGTH_SHORT).show(); relativeLayout.setAlpha(0f); } else if (scrollY < oldScrollY) { // 向上滚动 Toast.makeText(context, "Scrolling Up", Toast.LENGTH_SHORT).show(); relativeLayout.setAlpha(0f); } // 发送新的延迟停止检测任务 scrollStopHandler.postDelayed(scrollStopRunnable, SCROLL_STOP_DELAY); });
注意事项
- 页面销毁时需要手动移除Handler的任务,避免内存泄漏:
@Override protected void onDestroy() { super.onDestroy(); if (scrollStopHandler != null) { scrollStopHandler.removeCallbacks(scrollStopRunnable); } }
- 可以根据产品交互的灵敏度需求调整
SCROLL_STOP_DELAY的数值,数值越小停止判定越灵敏,越大越不容易误判。
内容的提问来源于stack exchange,提问作者Emmanuel Njorodongo
相关产品推荐
相关产品推荐

