it-swarm.com.de

Deaktivieren oder verhindern Sie Multitouch in Activity

Ich habe mehrere Ansichten zu einer Aktivität, die ein Benutzer nacheinander schnell berühren möchte, und ich fange diese Berührungen mit einer TouchListener und der Handhabung von MotionEvent.ACTION_DOWN ein. Wenn der Benutzer jedoch zwei Hände verwendet, ist es sehr wahrscheinlich, dass die nächste Ansicht "Touch" ist, bevor der Benutzer den vorherigen Finger nach oben zieht. In diesem Szenario wird ein MotionEvent.ACTION_MOVE für die erste Ansicht und nicht der gewünschte MotionEvent.ACTION_DOWN für die zweite Ansicht ausgelöst.

Gibt es eine Möglichkeit, dieses Verhalten zu umgehen oder zu verhindern? Ich habe versucht, ein neues Ereignis mit MotionEvent.ACTION_UP zu senden und auch den Ereignis-Listener zu entfernen, aber keiner scheint zu funktionieren.

25
cachance7

Um dieses Szenario zu umgehen, verwenden Sie am besten eine ViewGroup und implementieren die onInterceptTouchEvent-Methode, um die Berührungsereignisse manuell nach Ihren Wünschen zu routen. 

Dies wurde ursprünglich hier beantwortet: Android multitouch! jemanden hacken

Code zum Implementieren dieser Lösung (im Kommentarabschnitt der Antwort auf die obige Frage) finden Sie hier: http://Pastebin.com/hiE1aTCw

4
cachance7

Die einfachste Möglichkeit, eine einzelne Anwendung für eine gesamte App zu erzwingen, besteht darin, sie mithilfe eines Designs festzulegen:

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

Manifest:

  <application
        Android:label="@string/app_name"
        Android:theme="@style/MyTheme" >
65
Jeremie

wenn noch jemand nach der besten Lösung sucht, Fügen Sie in der XML-Datei den folgenden Code ein:

Android:splitMotionEvents = false 
16
Oren Zakay

Ich habe es so gemacht:

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

Ich denke, Sie können onTouchEvent für jede Ansicht überschreiben.

8
Pijetren

Ich habe dieses Problem mit einer benutzerdefinierten Methode gelöst - was ich nicht tun wollte.

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
user647826

Überschreiben Sie dispatchTouchEvent und fangen Sie dort alle Berührungen ab.

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

Dadurch werden die Berührungen abgebrochen und der gedrückte Zustand der Tasten gelöscht, ohne weitere Maßnahmen zu ergreifen.

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

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

                horizentalLinearGridItem.setMotionEventSplittingEnabled(false);

            }

Hier ist horizentalLinearGridItem die parentLayout-Ansicht, in die wir untergeordnete Ansichten einfügen. In diesem LinearLayout habe ich untergeordnete Ansichten hinzugefügt. Als ich jedoch gleichzeitig auf zwei untergeordnete Ansichten klickte, bekamen beide die Ereignisse. Um das zu blockieren, habe ich den obigen Code verwendet.

0
Abhijit Kurane

Ich habe es für mich arbeiten lassen, indem ich einfach Code in 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...
0
Amol Mejari