如何在NestedScrollView中停止正在滚动?

时间:2018-04-24 05:36:46

标签: android android-scrollview

我有一个按钮可以自动返回到NestedScrollView的顶部位置。当滚动不在进行时,它就像一个魅力,否则如果当前滚动正在进行中,滚动会转到顶部但直接滚动一下点亮... ...

我写了这个方法:

private void scrollToTop() {
        mScrollView.stopNestedScroll();
        mScrollView.postDelayed(new Runnable() {
            @Override
            public void run() {
                mScrollView.scrollTo(0, 0);
            }
        }, 50);
    }

你有没有想法阻止当前的滚动并立即登顶?

非常感谢

1 个答案:

答案 0 :(得分:1)

滚动实用时,正确的方法是拦截用户的触摸。这需要您延长ScrollView覆盖scrollToonInterceptTouchEvent方法,禁用用户触摸,同时列表滚动,之后返回触摸滚动完成。

所以序列将是这样的:

  1. 致电scrollTo以滚动至特定位置
  2. 启用停用触摸事件并开始滚动
  3. 的标记
  4. 滚动完成后状态变为空闲禁用标志
  5. P.S:我可以提供代码示例,但在编写代码时,您似乎比我有更多的专业知识。干杯!

    这是一段代码:

    import android.content.Context;
    import android.support.v4.widget.NestedScrollView;
    import android.util.AttributeSet;
    import android.view.MotionEvent;
    
    public class MyScrollView extends NestedScrollView {
    
        public static final int MAX_SCROLL_FACTOR = 1;
        boolean isAutoScrolling;
    
        public MyScrollView(Context context) {
            super(context);
        }
    
        public MyScrollView(Context context, AttributeSet attrs) {
            super(context, attrs);
        }
    
        public MyScrollView(Context context, AttributeSet attrs, int defStyleAttr) {
            super(context, attrs, defStyleAttr);
        }
    
        @Override
        public void scrollTo(int x, int y) {
            isAutoScrolling = true;
            super.scrollTo(x, y);
        }
    
    
        @Override
        public boolean onInterceptTouchEvent(MotionEvent event) {
            if (isAutoScrolling)
                return super.onTouchEvent(event);
    
            return false;
        }
    
        @Override
        public boolean onTouchEvent(MotionEvent event) {
            if (isAutoScrolling)
                return super.onTouchEvent(event);
    
    
            return false;
        }
    
        @Override
        protected void onScrollChanged(int x, int y, int oldX, int oldY) {
            super.onScrollChanged(x, y, oldX, oldY);
            if (isAutoScrolling) {
                if (Math.abs(y - oldY) < MAX_SCROLL_FACTOR  || y >= getMeasuredHeight() || y == 0
                        || Math.abs(x - oldX) < MAX_SCROLL_FACTOR || x >= getMeasuredWidth() || x == 0) {
                    isAutoScrolling = false;
                }
            }
        }
    }