在onTouchListener附加

时间:2015-04-22 23:13:13

标签: android ontouchlistener android-scrollview

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

这是触摸事件中显示的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。

1 个答案:

答案 0 :(得分:4)

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