android - 如何停止 NestedScrollView 中正在进行的滚动?

标签 android android-scrollview

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

我写了这个方法:

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

伙计们,你们有什么想法可以停止当前的滚动并立即回到顶部吗?

非常感谢

最佳答案

正确的方法是在您实用地滚动时拦截用户的触摸。这将需要您扩展 ScrollView 以覆盖 scrollToonInterceptTouchEvent 方法,并在列表为 禁用 用户触摸滚动,滚动完成后返回触摸。

所以顺序是这样的:

  1. 调用scrollTo滚动到指定位置
  2. 启用标志以禁用触摸事件并开始滚动
  3. 当滚动完成并且状态变为空闲时禁用标志

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.onInterceptTouchEvent(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;
            }
        }
    }
}

关于android - 如何停止 NestedScrollView 中正在进行的滚动?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49994111/

相关文章:

java - 将底部的线性布局固定为 android 中的页脚

java - android - MapFragment 位于 Fragment 内的 ScrollView 内

android - 机器人 :ScrollView Jerky and animation list not work

android - 在 android listview 中使用 onScroll

android - Realm block Gson 库

android - 调用 FloatingActionButton.hide() 是否与将 FloatingActionButton 的可见性设置为 Gone 相同?

android - 如何将现有的 Android Studio 项目连接到现有的 Github 存储库

android - 如何让多个监听器在 Android 中处理相同的 OnTouch 事件?

android - 使用自定义适配器获取 ListView 的高度

java - 迭代 HashMap 的 ArrayList 很困难