2010-09-08 153 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

相關問題