2011-12-20 45 views
20

我對活動有幾個視圖,用戶想要連續快速觸摸,並使用TouchListener和處理MotionEvent.ACTION_DOWN來捕獲這些觸摸。但是,如果用戶使用雙手,很可能在用戶拉動前一手指之前下一個視圖將被「觸摸」。在這種情況下,針對第一個視圖觸發MotionEvent.ACTION_MOVE,而不是第二個視圖所需的MotionEvent.ACTION_DOWN禁用或防止活動中的多點觸控

有什麼辦法可以解決或防止這種行爲?我試圖用MotionEvent.ACTION_UP調度一個新事件,並且還刪除了事件監聽器,但都不起作用。

+0

http:// stackoverflow。com/questions/8570982/disable-or-prevent-multitouch-in-activity/36281321#36281321 – 2016-03-29 10:14:36

回答

4

來解決它的最好方法方案是使用ViewGroup並實施onInterceptTouchEvent方法,以便根據需要手動路由觸摸事件。

這個原本在這裏找到答案: Android multitouch! hack anyone?

代碼使用這一解決方案(在回答上述問題的評論部分中找到)在這裏找到: http://pastebin.com/hiE1aTCw

2

我已經解決了這個使用一個自定義的方法 - 這是我不想做。如果有人發現了一個更好的辦法,我想聽聽它感謝:

public static void setViewGroupEnebled(ViewGroup view, boolean enabled) 
{ 
    int childern = view.getChildCount(); 

    for (int i = 0; i< childern ; i++) 
    { 
     View child = view.getChildAt(i); 
     if (child instanceof ViewGroup) 
     { 
      setViewGroupEnebled((ViewGroup) child,enabled); 
     } 
     child.setEnabled(enabled); 
    } 
    view.setEnabled(enabled); 
} 
7

我做了這樣的:

@Override 
public boolean onTouchEvent(MotionEvent event) { 
    // TODO Auto-generated method stub 

    if(event.getPointerCount() > 1) { 
     System.out.println("Multitouch detected!"); 
     return true; 
    } 
    else 
     return super.onTouchEvent(event); 
} 

我認爲你可以覆蓋onTouchEvent任何視圖。

56

我發現,在整個應用程序強制單點觸摸最簡單的方法是使用一個主題來進行設置:

<style name="MyTheme" parent="@android:style/Theme.Holo.Light"> 
    <item name="android:windowEnableSplitTouch">false</item> 
    <item name="android:splitMotionEvents">false</item> 
</style> 

清單:

<application 
     android:label="@string/app_name" 
     android:theme="@style/MyTheme" > 
+0

僅供參考,「android:splitMotionEvents」需要API級別11及以上 – gjman2 2015-09-26 04:37:30

+0

這對android 5.0及以上版本無效 – ThanosFisherman 2016-01-12 23:56:46

+3

工作對於我在Android 5.0.1中。 – 2016-03-01 09:27:09

0
int currentapiVersion = android.os.Build.VERSION.SDK_INT; 

      if (currentapiVersion >= android.os.Build.VERSION_CODES.HONEYCOMB) { 

       horizentalLinearGridItem.setMotionEventSplittingEnabled(false); 

      } 

這裏horizentalLinearGridItem是parentLayout圖,其中我們插入子視圖。 在我的代碼中它的LinearLayout。在這個LinearLayout中,我添加了子視圖。但是當我同時點擊兩個子視圖時,兩個都獲得了這些事件。要阻止我使用上面的代碼。

8

如果有人還在尋找最佳的解決方案, 放在XML下面的代碼:

android:splitMotionEvents = false 
+0

最簡單的工作解決方案 – 2018-03-02 02:00:01

0

我得到了它的只是OnTouchEvent方法添加一些代碼對我的工作,

boolean action_down_required = false; 

@Override 
public boolean onTouchEvent(MotionEvent event) { 

    int action = event.getAction(); 

    if(event.getPointerCount() > 1){ 
     action_down_required = true; 
     return true; 
    } 

    if(action_down_required){ 
     action = MotionEvent.ACTION_DOWN; 
    } 

    switch (action) { 
     case MotionEvent.ACTION_DOWN: 

      // your code goes here... 

      action_down_required = false; 
      break; 

     // Other events... 
1

覆蓋dispatchTouchEvent並攔截所有觸摸,對於所有多點觸摸,pointercount不止一個。

if(ev.getPointerCount() > 1) 
    { 
    Log.d("Multitouch detected!"); 
    ev.setAction(MotionEvent.ACTION_CANCEL); 
    } 

這取消觸摸並清除按鈕的按下狀態,而不採取任何進一步的操作。