其实这不是一个很难的问题,发现这个问题后想当然的百度一波,大多数文章都是说将onTouchEvent函数的返回值改成true,以此来接收后续事件,试了下发现并不管用,这个关键点在于你自定义的是view还是viewGroup,如果是ViewGroup,你需要重写onTouchEvent的同时也重写onInterceptTouchEvent函数,如下:
private float startX = 0f;
@Override
public boolean onTouchEvent(MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN) {
startX = event.getX();
}
if (event.getAction() == MotionEvent.ACTION_UP) {
float endX = event.getX();
//向左滑条件
if (endX - startX > 50 && currentIndex > 0) {
moveToRight();
}
if (startX - endX > 50 && currentIndex < getChildCount() - 1) {
moveToLeft();
}
}
return true;
}
@Override
public boolean onInterceptTouchEvent(MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN) {
startX = event.getX();
}
if (event.getAction() == MotionEvent.ACTION_UP) {
float endX = event.getX();
//向左滑条件
if (Math.abs(startX-endX)>50){
onTouchEvent(event);
}
}
return super.onInterceptTouchEvent(event);
}
*注:若不用考虑子view的点击事件,可以直接返回true,表示所有触摸事件父view都拦截,上面则是达到一定条件才拦截
@Override
public boolean onInterceptTouchEvent(MotionEvent event) {
return true;
}
我这里的条件是如果横向滑动距离超过50,自定义viewgroup就自己处理这个touch事件,关于判断条件就看大家自己的需求了