web-dev-qa-db-fra.com

Désactiver le contact multi-doigts dans mon application

Mon application utilise une activité pour héberger plusieurs fragments. Chaque fois qu'un fragment est affiché sur l'écran du téléphone. La vue de chaque fragment consiste en plusieurs icônes d'image. 

Actuellement, l'utilisateur peut appuyer sur deux icônes simultanément avec deux doigts (avec chaque doigt, appuyer sur une icône). Je souhaite désactiver cette fonctionnalité multi-touch sur mon application pour autoriser une seule pression sur une icône prend effet à la fois .

J'ai essayé les moyens suivants:

Voie 1: dans le thème de mon application, j'ai ajouté:

<item name="Android:windowEnableSplitTouch">false</item>

Way 2: Dans le manifeste Android xml, j'ai ajouté:

<uses-feature Android:name="Android.hardware.touchscreen.multitouch" Android:required="false" />

Voie 3: dans mon activité:

@Override
public boolean onTouchEvent(MotionEvent event) {

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

Malheureusement, aucune de mes solutions ne fonctionne. Alors, Comment puis-je désactiver la fonctionnalité multi-touch dans mon application? 

18
Leem.fin

Par exemple, vous avez plusieurs boutons et vous voulez sélectionner un seul bouton. Dans le parent (NOT ROOT, juste le parent de l'enfant) de boutons, dans ses paramètres xml, ajoutez

Android: splitMotionEvents = "false"

Et c'est tout. Exemple:

<LinearLayout
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    Android:orientation="horizontal"
    Android:splitMotionEvents="false" <-----------!!!
    >

    <Button
    Android:id="@+id/button_main_1"
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    Android:text="button1" />

    <Button
    Android:id="@+id/button_main_2"
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    Android:text="button2" />

    <Button
    Android:id="@+id/button_main_3"
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    Android:text="button3" />
</LinearLayout>

Btw. Lorsque vous avez 2 linéarisations avec 3 boutons par disposition, vous devez définir cet événement splitMotionEvents dans ces deux présentations et également dans parent de ces 2 linéairesLayouts. Sinon, vous ne pourrez cliquer que sur un bouton par mise en page (somme = 2 alors). J'espère que vous l'obtenez. :)

Aucune des autres solutions ne fonctionnait pour moi ou n'était trop boiteuse.

36
deadfish

Oui, j’ai également fait face à ce problème une fois Et j’ai trouvé une solution qui: Android: splitMotionEvents = "false" Ceci ne fonctionnera que pour les enfants directs d’une mise en page.

Exemple

Comme si vous créez deux modèles A et B et Dans A, vous avez deux boutons b1, b2 En B, vous avez deux boutons b3, b4.

a et B sont tous deux dans la disposition parente Donc, vous devez d'abord préciser que ces boutons ne sont pas des enfants directs de la disposition parente

Dans la disposition des parents, n’avez que deux enfants A et B

Que si vous ajoutez Android: splitMotionEvents = "false" à la disposition parentale , La fonction Multi Touch ne fonctionnera pas sur les dispositions A et B, mais sur chaque bouton b1, b2, b3, b4 car ce ne sont pas des enfants directs de Parent Layout

Donc, si vous voulez que le multi-touch ne fonctionne pas sur ces boutons également Ensuite, vous devez ajouter Android: splitMotionEvents = "false" ceci pour chaque mise en page séparément 

Il y a quelques cas:

1) .Si vous ajoutez seulement Android: splitMotionEvents = "false" sur Layout A Que vous ne pouvez pas toucher le bouton b1 et le bouton b2 en même temps Mais vous pouvez toucher le bouton b1 ou b2 et le bouton b3 ou b4 en même temps.

2) juste en face du cas 1.

3) Mais si vous ajoutez Android: splitMotionEvents = "false" sur les deux dispositions, vous ne pouvez pas toucher deux boutons en même temps sur votre écran.

<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:tools="http://schemas.Android.com/tools"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:orientation="vertical"
Android:splitMotionEvents="false" >

<LinearLayout
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    Android:orientation="horizontal"
    Android:splitMotionEvents="false" >

    <Button
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:text="b1" />

    <Button
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:text="b2" />
</LinearLayout>

<LinearLayout
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    Android:orientation="horizontal"
    Android:splitMotionEvents="false" >

    <Button
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:text="b3" />

    <Button
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:text="b4" />
</LinearLayout>

Je pense que cela pourrait vous être utile.

10
sachin pareek

Vous pouvez placer l'utilisateur GestureOverlayView sur tout l'écran et permettre uniquement au premier événement tactile d'être traité par les vues inférieures.

Vous devez configurer un onTouchListener sur cette vue transparente, ce qui fait quelque chose comme ceci:

gestureOverlayView.setOnTouchListener(new View.OnTouchListnener(){
    @Override
    public boolean onTouch(View v, MotionEvent e){
       // True means the event is ignored by the overlayed views 
       return e.getPointerCount() > 1 ? true : false;
    }
}
1
Emil Davtyan