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