我有一个自定义的Android视图,它重写onTouchEvent(MotionEvent)以处理视图内的内容的水平滚动。但是,当包含它的ScrollView垂直滚动时,自定义视图停止接收触摸事件。理想情况下,我想让自定义视图继续接收事件,以便它可以处理自己的水平滚动,而包含视图层次结构处理垂直滚动。Android视图在父滚动时停止接收触摸事件
有什么办法可以继续在滚动上接收这些动作事件吗?如果没有,是否有其他方法可以获得我需要的触摸事件?
我有一个自定义的Android视图,它重写onTouchEvent(MotionEvent)以处理视图内的内容的水平滚动。但是,当包含它的ScrollView垂直滚动时,自定义视图停止接收触摸事件。理想情况下,我想让自定义视图继续接收事件,以便它可以处理自己的水平滚动,而包含视图层次结构处理垂直滚动。Android视图在父滚动时停止接收触摸事件
有什么办法可以继续在滚动上接收这些动作事件吗?如果没有,是否有其他方法可以获得我需要的触摸事件?
我在回答我自己的问题,以防其他人在搜索结果中显示为Google Googling。 :P
解决此问题的方法是扩展ScrollView并重写onInterceptTouchEvent方法,以便它仅拦截Y运动显着(大于X运动,根据一个建议)的触摸事件。
在子视图中使用requestDisallowInterceptTouchEvent(true)可防止垂直滚动,如果您想要继续进行水平滚动,并且在完成后进行重置。
private float downXpos = 0;
private float downYpos = 0;
private boolean touchcaptured = false;
@Override
public boolean onTouchEvent(MotionEvent event) {
switch(event.getAction()) {
case MotionEvent.ACTION_DOWN:
downXpos = event.getX();
downYpos = event.getY();
touchcaptured = false;
break;
case MotionEvent.ACTION_UP:
requestDisallowInterceptTouchEvent(false);
break;
case MotionEvent.ACTION_MOVE:
float xdisplacement = Math.abs(event.getX() - downXpos);
float ydisplacement = Math.abs(event.getY() - downYpos);
if(!touchcaptured && xdisplacement > ydisplacement && xdisplacement > 10) {
requestDisallowInterceptTouchEvent(true);
touchcaptured = true;
}
break;
}
super.onTouchEvent(event);
return true;
}
完美的解决方案,当我应该期待这个代码,并运作良好。当滚动停止向下或向上并向左或向右移动时触摸。 – 2015-05-06 05:27:41
只是为了澄清 - 最后收到的动作事件是取消动作(MotionEvent#ACTION_CANCEL)。 – Adrian 2010-09-08 15:07:12