我有一个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事件中的方法在我返回时不会触发假。在此先感谢,非常感谢任何帮助。
编辑: 因此,不是检查用户是否在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。
答案 0 :(得分:4)
如果从onTouch
返回true,则说明您已经处理了该事件,并且没有其他侦听器应该尝试处理它。如果我必须GUESS ScrollView
也是该onTouch
方法的监听器,当您返回true时,从不调用ScrollView的onTouch,因为您的方法处理了该事件。