我有一個自定義的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