Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

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

Ответ 3

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

@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 для любого вида.

Ответ 4

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

android:splitMotionEvents = false 

Ответ 5

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

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

Ответ 6

Переопределить dispatchTouchEvent и перехватить все касания там, для всех множественных касаний указатель содержит более одного.

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

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

Ответ 7

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

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

                horizentalLinearGridItem.setMotionEventSplittingEnabled(false);

            }

Здесь horizentalLinearGridItem - это представление parentLayout, где мы вставляем дочерние представления. В моем коде LinearLayout. В этом LinearLayout я добавил дочерние представления. Но когда я дважды щелкнул два дочерних представления, оба получили события. Чтобы заблокировать это, я использовал приведенный выше код.

Ответ 8

Я получил его для работы, просто добавив код в метод 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...