You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 22:39:06