在“活动”中禁用或防止多点触控

我有一个用户想要连续快速触摸的Activity的几个视图,并使用TouchListener捕获这些触摸并处理TouchListener 。 但是,如果用户使用双手,在用户拉上前一个手指之前,下一个视图很可能会被“触摸”。 在这种情况下,会为第一个视图触发MotionEvent.ACTION_DOWN ,而不是第二个视图所需的MotionEvent.ACTION_DOWN

有什么办法可以解决或防止这种行为? 我试着用MotionEvent.ACTION_UP调度一个新的事件,也删除事件监听器,但似乎都没有工作。

Solutions Collecting From Web of "在“活动”中禁用或防止多点触控"

我发现在整个应用程序中强制单点触摸的最简单方法是使用主题进行设置:

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

performance:

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

我是这样做的:

 @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任何视图。

如果有人仍然在寻找最佳解决scheme,请在xml中input以下代码:

 android:splitMotionEvents = false 

解决此情况的最佳方法是使用ViewGroup并实施onInterceptTouchEvent方法,以根据需要手动路由触摸事件。

这是最初的答案: Android多点触摸! 破解任何人?

执行此解决scheme的代码(可在上述问题的答案的注释部分中find)可在此处find: http : //pastebin.com/hiE1aTCw

我已经解决了这个使用自定义的方法 – 我不想做的如果有人find一个更好的方法,我想听到它谢谢:

 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); } 

重写dispatchTouchEvent并拦截所有的触摸点,对于所有多点触摸,pointercount不止一个。

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

这将取消触摸并清除button的按下状态,而不会采取任何进一步的操作。

 int currentapiVersion = android.os.Build.VERSION.SDK_INT; if (currentapiVersion >= android.os.Build.VERSION_CODES.HONEYCOMB) { horizentalLinearGridItem.setMotionEventSplittingEnabled(false); } 

这里horizentalLinearGridItem是我们插入子视图的parentLayout视图。 在我的代码LinearLayout。 在这个LinearLayout中,我添加了子视图。 但是,当我同时点击两个孩子的观点,都获得了事件。 要阻止我使用上面的代码。

通过在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...