【问题标题】:Scrollview not flinging after onTouchListener attached附加了 onTouchListener 后,滚动视图不闪烁
【发布时间】:2015-04-22 23:13:12
【问题描述】:

我有一个 ScrollView,它有一个 ViewTreeObserver.OnScrollChangedListener,这不是问题,但是一旦我设置 OnTouchListener 来确定 ScrollView 何时停止滚动,滚动视图上的投掷动作就不会再发生了。这是我的代码:

如果我这样做,它实际上并没有运行我为 onTouch 事件提供的方法,并且仍然会发生抛出:

@Override
    public boolean onTouch(View view, MotionEvent event) {
        if (event.getAction() == MotionEvent.ACTION_UP) {
            horizontalScrollClipping((ScrollView)view, view.getScrollY());
            return false;  //returning false instead of true
        }
        return false;
    }

如果我这样做,onTouch 事件中的方法会触发,但不会发生滚动视图的投掷:

@Override
    public boolean onTouch(View view, MotionEvent event) {
        if (event.getAction() == MotionEvent.ACTION_UP) {
            horizontalScrollClipping((ScrollView)view, view.getScrollY());
            return true;  //returning true instead false
        }
        return false;
    }

最后,如果我这样做,ScrollView 上的滚动将完全禁用:

@Override
    public boolean onTouch(View view, MotionEvent event) {
        if (event.getAction() == MotionEvent.ACTION_UP) {
            horizontalScrollClipping((ScrollView)view, view.getScrollY());
            return true;   //return true for both
        }
        return true;
    }

这里是 Touch Event 中显示的 Horizo​​ntalScrollClipping 方法:

private void horizontalScrollClipping(ScrollView scrollView, int scrollY) {
        if (scrollY > (image.getHeight() * 0.60)) {
            scrollView.smoothScrollTo(0, image.getHeight());
        }
    }

只是想知道是否有人能告诉我为什么当附加 OnTouchListener 并返回 true 时滚动视图的默认投掷动作被禁用,以及为什么我在 OnTouch 事件中的方法在我返回时没有触发错误的。提前致谢,非常感谢您的帮助。

编辑: 因此,我不是在 onTouch 界面中检查用户是否完成滚动,而是计算用户是否在 OnScrollChangedListener 中完成滚动,如下所示:

scrollView.getViewTreeObserver().addOnScrollChangedListener(new ViewTreeObserver.OnScrollChangedListener() {
            @Override
            public void onScrollChanged() {
                int scrollY = scrollView.getScrollY();
                if ((scrollY - lastScrollY) < 5 && (scrollY - lastScrollY) > 0) {
                    horizontalScrollClipping((ScrollView)scrollView, scrollY);
                }
                lastScrollY = scrollY;
            }
        });

lastScrollY 是一个变量,在我的类顶部初始化为 0。

【问题讨论】:

    标签: android ontouchlistener android-scrollview


    【解决方案1】:

    如果您从 onTouch 返回 true,则表示您已经处理了该事件,并且其他侦听器不应尝试处理它。如果我不得不猜测ScrollView 也是该onTouch 方法的侦听器,并且当您返回true 时,永远不会调用ScrollView 的onTouch,因为您的方法处理了事件。

    【讨论】:

    • 在我调用自己的 onTouch 方法时,是否有调用滚动视图 onTouch 的方法?
    • 您是否继承ScrollView 并覆盖onTouch?如果是这样,您可以致电super.onTouch。如果您没有子类化并且您“拥有”ScrollView,那么只需从您的onTouch 内部调用它的onTouch 方法。
    • 我可以从子类 ScrollView 调用的唯一触摸事件方法,或者只是 'have-a' ScrollView 是 super.onTouchEvent(MotionEvent event);这会提供相同的功能吗?
    • 我最终对它进行了编辑并朝着不同的方向发展,您可以在上面看到我的编辑。感谢您的所有帮助
    猜你喜欢
    • 2020-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-27
    • 2010-11-17
    相关资源
    最近更新 更多