wake-up-neo.com

Deaktivieren Sie die Multi-Finger-Berührung in meiner App

Meine App verwendet eine Aktivität, um mehrere Fragmente zu hosten. Jedes Mal, wenn ein Fragment auf dem Telefonbildschirm angezeigt wird, besteht die Ansicht jedes Fragments aus mehreren Bildsymbolen. 

Derzeit kann der Benutzer zwei Symbole gleichzeitig mit zwei Fingern drücken (wobei jeder Finger auf ein Symbol drückt). Ich möchte diese Multi-Touch-Funktion deaktivieren in meiner App, um zuzulassen, es kann jeweils nur ein Symbol gedrückt werden .

Ich habe folgende Möglichkeiten ausprobiert:

Weg 1: in meinem App-Theme habe ich hinzugefügt:

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

Weg 2: In Android Manifest-XML habe ich hinzugefügt:

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

Weg 3: in meiner Aktivität:

@Override
public boolean onTouchEvent(MotionEvent event) {

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

Leider funktioniert keine meiner Lösungen. Also, Wie kann ich die Multi-Touch-Funktion deaktivieren in meiner App? 

18
Leem.fin

Für den Fall: Sie haben mehrere Schaltflächen und möchten nur eine Schaltfläche auswählen. In parent (NICHT ROOT, nur übergeordnetes Kind) von Schaltflächen, in ihren XML-Params hinzufügen

Android: splitMotionEvents = "false"

Und das ist es. Beispiel:

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

Übrigens Wenn Sie zwei lineare Layouts mit drei Schaltflächen pro Layout haben, sollten Sie diese splitMotionEvents in diesen beiden Layouts und auch in parent von diesen 2 linearen Layouts festlegen. Andernfalls können Sie nur eine Schaltfläche pro Layout anklicken (Summe = 2). Ich hoffe du verstehst es. :)

Keine der anderen Lösungen funktionierte für mich oder war zu lahm.

36
deadfish

Ja, ich stand auch einmal vor diesem Problem Und fand eine Lösung, dass Android: splitMotionEvents = "false" Dies funktioniert nur, um Kinder eines Layouts zu leiten.

Beispiel

Zum Beispiel, wenn Sie zwei Layouts A und B und Erstellen. In A haben Sie zwei Schaltflächen b1, b2 . In B haben Sie zwei Schaltflächen b3, b4

sowohl A als auch B befinden sich im übergeordneten Layout Daher müssen Sie zunächst festlegen, dass diese Schaltflächen keine direkten untergeordneten Elemente des übergeordneten Layouts sind

Im übergeordneten Layout haben nur zwei Kinder A und B

Wenn Sie dann Android hinzufügen: splitMotionEvents = "false" zu Parent Layout , Wird Multitouch auf Layout A und Layout B nicht funktionieren, aber es funktioniert auf jeder Taste b1, b2, b3, b4, weil Dies sind keine direkten Kinder des übergeordneten Layouts

Wenn Sie möchten, dass Multi-Touch auch auf diesen Schaltflächen nicht funktioniert Dann müssen Sie Android: splitMotionEvents = "false" dies zu jedem Layout separat hinzufügen 

Es gibt einige Fälle:

1) .Wenn Sie nur Android hinzufügen: splitMotionEvents = "false" on Layout A , Als Sie die Tasten b1 und b2 nicht gleichzeitig berühren können . Sie können jedoch die Schaltfläche b1 berühren oder b2 und button b3 oder b4 gleichzeitig.

2). genau das Gegenteil von Fall 1.

3). Wenn Sie jedoch Android hinzufügen: splitMotionEvents = "false" auf beiden Layouts, können Sie nicht gleichzeitig zwei Schaltflächen auf Ihrem Bildschirm berühren.

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

Ich denke, es könnte für Sie hilfreich sein.

10
sachin pareek

Sie können dem Benutzer eine GestureOverlayView um den gesamten Bildschirm legen und nur das erste Berührungsereignis von den unteren Ansichten verarbeiten lassen.

Sie müssen einen onTouchListener für diese transparente Ansicht einrichten, die etwa Folgendes bewirkt:

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