Отключить или запретить мультитач в действии

у меня есть несколько представлений о деятельности, которую пользователь хочет быстро коснуться последовательно, и я фиксирую эти прикосновения с помощью TouchListener и обращении MotionEvent.ACTION_DOWN. Однако, если пользователь использует две руки, очень вероятно, что следующий вид будет "прикоснуться", прежде чем пользователь потянет предыдущий палец вверх. В этом случае MotionEvent.ACTION_MOVE запускается для первого просмотра, а не для желаемого MotionEvent.ACTION_DOWN второй вид.

есть ли способ обойти или предотвратить такое поведение? Я пробовал отправить новое событие с помощью MotionEvent.ACTION_UP а также удаление прослушивателя событий, но ни один из них не работает.

8 ответов


самый простой способ заставить одно касание по всему приложению-установить его с помощью темы:

<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" >

если кто-то еще ищет лучшее решение, поместите в xml следующий код:

android:splitMotionEvents = false 

Я сделал это так:

@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 для любого представления.


лучший способ обойти этот сценарий-использовать ViewGroup и реализовать onInterceptTouchEvent метод для ручной маршрутизации событий касания, как вы считаете нужным.

первоначально ответ был дан здесь: Android мультитач! взломать кого-нибудь?

код, реализующий это решение (находится в разделе комментариев ответа на вышеуказанный вопрос), находится здесь: http://pastebin.com/hiE1aTCw


Я решил это с помощью пользовательского метода , который я не хотел делать, если кто-нибудь найдет лучший способ, я хотел бы услышать об этом спасибо:

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

это отменяет касания и очищает нажатое состояние кнопок без каких-либо дальнейших действий.


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

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

                horizentalLinearGridItem.setMotionEventSplittingEnabled(false);

            }

здесь horizentalLinearGridItem-это представление parentLayout, в которое мы вставляем дочерние представления. В моем коде его краю. В этом 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...