首页 文章

附加onTouchListener后,Scrollview不会抛出

提问于
浏览
3

我有一个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;
    }

这是触摸事件中显示的horizontalScrollClipping方法:

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

只是想知道是否有人可以告诉我为什么当附加OnTouchListener并返回true时,为什么滚动视图的默认投掷操作被禁用,以及为什么我在OnTouch事件中的方法在我返回false时不会触发 . 在此先感谢,非常感谢任何帮助 .

编辑:因此,如果用户在OnScrollChangedListener中滚动完成,则不是检查用户是否在onTouch界面上完成了滚动:

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 .

1 回答

  • 4

    如果从 onTouch 返回true,则说明您已经处理了该事件,并且没有其他侦听器应该尝试处理它 . 如果我不得不GUESS ScrollView 也是 onTouch 方法的监听器,当你返回true时,从不调用ScrollView的onTouch因为你的方法处理了这个事件 .

相关问题