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

时间:2017-10-30 05:29:12

标签: android android-button android-scrollview

我在滚动视图处于空闲状态时试图隐藏按钮。按钮在滚动时间内应该是不可见的。(其余的时间按钮应该是可见的)

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);
        }
    }
});

4 个答案:

答案 0 :(得分:0)

尝试以下代码

@Override
    public void onScrollStateChanged(AbsListView view, int scrollState) {
        if(scrollState == SCROLL_STATE_IDLE){
            //do your stuff here
        }
}

答案 1 :(得分:0)

找到解决方案

    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 :(得分:0)

即使这个问题有点老了,ScrollView并没有被使用,但我不得不实现一些与此相关的东西,我在每个建议和Kotlin上都使用了NestedScrollView

如果您使用的是Java,那么这将是不可能的或“干净的” 如果您使用的是ScrollView,只需将此处显示的内容从NestedScrollView更改为ScrollView

我将展示两种实现方法:

1。

首先,创建您的NestedScrollViewExtensions.kt文件:


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()并直接调用侦听器。

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


scroll_view.onScrollStateChanged(object : NestedViewScrollChangedListener {
            override fun onScrollStart() {
                fab.shrink()
            }

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

2。

如果您想要简化的版本(我的首选),只需在其中添加(或更改)NestedScrollViewExtensions.kt内容:


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

            MotionEvent.ACTION_CANCEL, MotionEvent.ACTION_UP -> {
                handler.postDelayed({
                    listener.invoke(false)
                }, 400)
            }
        }
        false
    }
}

这样,实现更干净:


        scroll_view.onScrollStateChanged { isScrolling -> 
            if(isScrolling) fab.shrink() else fab.extend()
        }

祝你好运:)

答案 3 :(得分:0)

在Kotlin中,您可以使用此

inline fun NestedScrollView.scrollState(crossinline idle: () -> Unit, crossinline scrolled: () -> Unit) {
    setOnTouchListener { _, event ->
        when (event.action) {
            MotionEvent.ACTION_SCROLL,
            MotionEvent.ACTION_MOVE,
            MotionEvent.ACTION_DOWN -> {
                scrolled()
            }
            MotionEvent.ACTION_CANCEL,
            MotionEvent.ACTION_UP -> {
                idle()
            }
        }
        false
    }
}