2010-09-08 115 views
4

我有一个自定义的Android视图,它重写onTouchEvent(MotionEvent)以处理视图内的内容的水平滚动。但是,当包含它的ScrollView垂直滚动时,自定义视图停止接收触摸事件。理想情况下,我想让自定义视图继续接收事件,以便它可以处理自己的水平滚动,而包含视图层次结构处理垂直滚动。Android视图在父滚动时停止接收触摸事件

有什么办法可以继续在滚动上接收这些动作事件吗?如果没有,是否有其他方法可以获得我需要的触摸事件?

+0

只是为了澄清 - 最后收到的动作事件是取消动作(MotionEvent#ACTION_CANCEL)。 – Adrian 2010-09-08 15:07:12

回答

1

我在回答我自己的问题,以防其他人在搜索结果中显示为Google Googling。 :P

解决此问题的方法是扩展ScrollView并重写onInterceptTouchEvent方法,以便它仅拦截Y运动显着(大于X运动,根据一个建议)的触摸事件。

6

在子视图中使用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; 
} 
+0

完美的解决方案,当我应该期待这个代码,并运作良好。当滚动停止向下或向上并向左或向右移动时触摸。 – 2015-05-06 05:27:41

相关问题