Désactiver ou prévenir l'activité multitouch

j'ai plusieurs vues sur une activité qu'un utilisateur veut toucher rapidement dans la succession et je capture ces touches en utilisant un TouchListener et la manipulation MotionEvent.ACTION_DOWN . Cependant, si l'utilisateur utilise deux mains, il est très probable que la vue suivante sera "touchée" avant que l'utilisateur ne relève le doigt précédent. Dans ce scénario, un MotionEvent.ACTION_MOVE est déclenché pour la première vue plutôt que l'option MotionEvent.ACTION_DOWN pour la seconde vue.

y a-t-il un moyen de travailler autour ou prévenir ce comportement? J'ai essayé l'envoi d'un nouvel événement avec MotionEvent.ACTION_UP et aussi enlever l'écouteur d'événement, mais ils ne semblent travailler.

23
demandé sur kameny 2011-12-20 08:55:38

8 réponses

la façon la plus facile que j'ai trouvé pour forcer simple touch à travers une application entière est de la mettre en utilisant un thème:

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

manifeste:

  <application
        android:label="@string/app_name"
        android:theme="@style/MyTheme" >
63
répondu Jeremie 2014-03-26 18:15:54

si quelqu'un cherche toujours la meilleure solution, mettez dans le xml le code suivant:

android:splitMotionEvents = false 
14
répondu Oren Zakay 2015-10-27 10:33:52

Je l'ai fait comme ceci:

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

je pense que vous pouvez outrepasser onTouchEvent pour n'importe quelle vue.

8
répondu Pijetren 2012-09-06 10:38:49

la meilleure façon de contourner ce scénario est d'utiliser un ViewGroup et d'implémenter la méthode onInterceptTouchEvent pour router manuellement les événements tactiles comme bon vous semble.

: Android multitouch! pirater quelqu'un?

Le Code

implémentant cette solution (trouvé dans la section Commentaires de la réponse à la question ci-dessus) se trouve ici: http://pastebin.com/hiE1aTCw

4
répondu cachance7 2017-05-23 12:17:58

j'ai résolu cela en utilisant une méthode personnalisée - ce que je ne voulais pas faire si quelqu'un trouve une meilleure façon, je voudrais en entendre parler merci:

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);
}
2
répondu 2011-12-20 07:02:34

Remplacer dispatchTouchEvent et d'intercepter toutes les touches y, pour toutes les touches de la pointercount est plus un.

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

Ceci annule les touches et efface l'état pressé des boutons sans prendre aucune autre mesure.

1
répondu chetna priyadarshini 2017-02-27 16:35:17
int currentapiVersion = android.os.Build.VERSION.SDK_INT;

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

                horizentalLinearGridItem.setMotionEventSplittingEnabled(false);

            }

ici horizentalLinearGridItem est parentLayout view où nous insérons le point de vue des enfants. Dans mon code, sa linéarité. Dans cette linéarité j'ai ajouté des opinions d'enfant. Mais quand j'ai cliqué sur deux opinions d'enfant simultanément, les deux obtenaient les événements. Pour bloquer ça, j'ai utilisé le code ci-dessus.

0
répondu Abhijit Kurane 2015-01-29 09:42:11

Je l'ai obtenu pour travailler pour moi en ajoutant juste un peu de code dans OnTouchEvent méthode,

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...
0
répondu Amol Mejari 2016-09-27 04:03:41