首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何检测Android滚动视图是否处于空闲状态?

如何检测Android滚动视图是否处于空闲状态?
EN

Stack Overflow用户
提问于 2017-10-30 13:29:12
回答 4查看 1.7K关注 0票数 2

我试图隐藏一个按钮时,滚动视图是空闲的state.the按钮应该是不可见的,只有在滚动时间。(其余时间按钮应该是可见的)

代码语言:javascript
运行
复制
scrollView.setOnScrollChangeListener(new ScrollView.OnScrollChangeListener() {
    @Override
    public void onScrollChange(View v, int scrollX, int scrollY, int oldScrollX, int oldScrollY) {
        if (scrollX == scrollY)  {
            Button.setVisibility(View.VISIBLE);
        } else if ((scrollY > oldScrollY)) {
            Button.setVisibility(View.INVISIBLE);
        }
    }
});
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2017-10-30 13:46:33

找到解决方案

代码语言:javascript
运行
复制
    scrollView.setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch( View v, MotionEvent event ) {
            switch ( event.getAction( ) ) {
                case MotionEvent.ACTION_SCROLL:
                case MotionEvent.ACTION_MOVE:
                    Log.e( "SCROLL", "ACTION_SCROLL" );
                    break;
                case MotionEvent.ACTION_DOWN:
                    Log.e( "SCROLL", "ACTION_DOWN" );
                    break;
                case MotionEvent.ACTION_CANCEL:
                case MotionEvent.ACTION_UP:
                    Log.e( "SCROLL", "SCROLL_STOP" );
                    break;
            }
            return false;
        }
    });
票数 2
EN

Stack Overflow用户

发布于 2017-10-30 13:35:19

尝试下面的代码

代码语言:javascript
运行
复制
@Override
    public void onScrollStateChanged(AbsListView view, int scrollState) {
        if(scrollState == SCROLL_STATE_IDLE){
            //do your stuff here
        }
}
票数 0
EN

Stack Overflow用户

发布于 2019-05-24 00:55:25

尽管这个问题有点老了,而且ScrollView也没有用到,但我不得不实现一些与此相关的东西,我使用的是NestedScrollView per recommendation和Kotlin。

如果你使用的是Java,这是不可能的,或者是“干净”的,你需要创建静态的util方法,而使用Kotlin,你可以做如下所示的扩展函数。如果您使用的是ScrollView,只需将您在此处看到的内容从NestedScrollView更改为ScrollView即可。

我将展示两种实现此功能的方法:

首先,创建NestedScrollViewExtensions.kt文件:

1.

如果您想要一个简化的(我首选的)版本,只需将此代码片段添加到您的NestedScrollViewExtensions.kt文件中:

代码语言:javascript
运行
复制
fun NestedScrollView.onScrollStateChanged(startDelay: Long = 100, stopDelay: Long = 400, listener: (Boolean) -> Unit) {
    setOnTouchListener { _, event ->
        when (event.action) {
            MotionEvent.ACTION_SCROLL, MotionEvent.ACTION_MOVE -> {
                handler.postDelayed({
                    listener.invoke(true)
                }, startDelay)
            }

            MotionEvent.ACTION_CANCEL, MotionEvent.ACTION_UP -> {
                handler.postDelayed({
                    listener.invoke(false)
                }, stopDelay)
            }
        }
        false // Do not consume events
    }
}

通过这种方式,实现更加清晰:

代码语言:javascript
运行
复制
        scroll_view.onScrollStateChanged { isScrolling -> 
            if(isScrolling) fab.shrink() else fab.extend()
        }

2

和不太干净的方式

代码语言:javascript
运行
复制
interface NestedViewScrollChangedListener {
    fun onScrollStart()

    fun onScrollStop()
}

@SuppressLint("ClickableViewAccessibility")
fun NestedScrollView.onScrollStateChanged(listener: NestedViewScrollChangedListener) {
    this.setOnTouchListener { _, event ->
        when(event.action) {
            MotionEvent.ACTION_SCROLL, MotionEvent.ACTION_MOVE -> {
                handler.postDelayed({
                    listener.onScrollStart()
                }, 100)
            }

            MotionEvent.ACTION_CANCEL, MotionEvent.ACTION_UP -> {
                handler.postDelayed({
                    listener.onScrollStop()
                }, 400)
            }
        }
        false // Don't consume touch events
    }
}

在这里,我使用了一个简单的延迟,这对我来说很有效,因为我需要一个动画发生,你可以随意删除所有的handler.postDelay()并直接调用监听器。

NestedViewScrollChangedListener上面的接口需要这样实现:

代码语言:javascript
运行
复制
scroll_view.onScrollStateChanged(object : NestedViewScrollChangedListener {
            override fun onScrollStart() {
                fab.shrink()
            }

            override fun onScrollStop() {
                fab.extend()
            }
        })

祝你好运:)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47008608

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档