Wie kann man Multitouch disablen?

Jaiel

Jaiel

Dauergast
235
Hey wie kann ich verhindern dass meine View mehr als 1 touchevent gleichzeitige verarbeitet:


Zur Zeit besteht meine Lösung aus folgenden Zeilen:

PHP:
@Override

int touchEvent;
	public boolean onTouchEvent(MotionEvent e) 
	{
		super.onTouchEvent(e);
		  switch(e.getAction())
		  {
		  	case MotionEvent.ACTION_DOWN:
		  		touchEvent++;
		  		if(touchEvent!=1)break;

				  ...foobar...

		          break;
              case MotionEvent.ACTION_MOVE:
                   ...foobar...;break;


		  	case MotionEvent.ACTION_UP:
		  		if(touchEvent--!=1)break;
		  		
                   ...foobar...

		           break;
		  }


gibt es eine elegantere Lösung?
Das Problem ist auch das es nur richtig funktioniert wenn der 2,3,4 touchEvent losgelassen wird bevor touchEvent 1 vom Bildschirm loslässt sonst interpretiert der Code es als tocuhEvent 2,3,4, und umgekehrt 2 oder 3 oder 4 als 1
 
Zuletzt bearbeitet:
Funktioniert es nicht wenn du vor dem switch schreibst:
if ( touchEvent >= 1) return false;
 
  • Danke
Reaktionen: Jaiel
stimmt auf den ersten blick ist das die lösung danke

ich muss das dann im falle ontouch down und up machen damit der move noch erkannt wird sonst blockt das ja die ganze abfrage

Der ursprüngliche Beitrag von 15:54 Uhr wurde um 16:00 Uhr ergänzt:

edit auf den zweiten blick scheint das auch nicuht zuklappen es wäre ja nichts qnsderes als meuin break statement
 
Dann vielleicht auf beim zweiten onTouchDown auf =1 setzen?
Wenn ich später noch zu komme, mache ich mir mal ein kleines Testprogramm... Es gibt ganz sicher eine Lösung, aber ohne es selbst auszuprobieren, finde ich es immer schwierig sich in dieses "Kopf-Lego" hineinzuversetzen :D
 
jo würde mci hfreuen das problem ist eig nur den touch up richtig abzufragen den 2. tocuh down kann man leicht abfangen aber wie soll das dann im touch up funzen...
da kann man ncihts mit variablen hoch oder runterzählen erreichen irgendwie...

im Internet finde ich auch nur immer was von android:splitMotionEvents="false" aber nur im zusammenhang mit buttons

Der ursprüngliche Beitrag von 18:37 Uhr wurde um 18:40 Uhr ergänzt:

viele propagieren auch dass es nicht geht und man müsste es selber implementieren im code....guter Ansatz aber die Lösung ist ncoh nciht zum greifen nah leider


ein Ansatz von mir wäre noch zu prüfen wie weit die jeweiligen touch event von einander liegen falls nur angtippt wird dann werden die event ja auf dem gleichen punkt sein fast also nciht weit voneinder entfernt und bei move ebenso(letzter moveevent vom touchup event)

kann man trotzdem austricksen aber das wäre bis jetzt die naheliegendste lösung meinerseits
 
Zuletzt bearbeitet:
Bei MotionEvent wird doch für jeden Finger ein sogenannter Pointer erzeugt. Kannst du nicht beim "Down"/"Pointer_Down" dir die ID des ersten Pointers merken und nur auf Änderungen von dieser PointerID reagieren, bis du von dieser ID wieder ein Up/Pointer_Up bekommst?

Vermutlich wirst du alle weiteren Events auch erstmal ignorieren müssen, bis die Gesamtzahl von Pointer wieder 0 ist. Du willst ja nicht, je nachdem in welcher Reihenfolge die Finger vom Display genommen werden, dann doch noch auf den letzten reagieren.


Info: Auch das ist reine Theorie meinerseits. Ich beziehe mich hauptsächlich hierauf: http://developer.android.com/reference/android/view/MotionEvent.html
Multi-touch screens emit one movement trace for each finger. The individual fingers or other objects that generate movement traces are referred to as pointers. Motion events contain information about all of the pointers that are currently active even if some of them have not moved since the last event was delivered. [...] The number of pointers only ever changes by one as individual pointers go up and down, except when the gesture is canceled.

Each pointer has a unique id that is assigned when it first goes down (indicated by ACTION_DOWN or ACTION_POINTER_DOWN). A pointer id remains valid until the pointer eventually goes up (indicated by ACTION_UP or ACTION_POINTER_UP) or when the gesture is canceled (indicated by ACTION_CANCEL)
[...]
The order in which individual pointers appear within a motion event is undefined. Thus the pointer index of a pointer can change from one event to the next but the pointer id of a pointer is guaranteed to remain constant as long as the pointer remains active. Use the getPointerId(int) method to obtain the pointer id of a pointer to track it across all subsequent motion events in a gesture. Then for successive motion events, use the findPointerIndex(int) method to obtain the pointer index for a given pointer id in that motion event.
 
Zuletzt bearbeitet:
Mmmmmh ja stimmt diese Seite hat mir geholfen https://developer.android.com/training/gestures/multi.html
es gibt ausserdem noch einen case den ich nicht kannte: Action_pointer_down

Ich werfe es dann so wie du schon sagtest machen und mich auf die jeweilige pointer ids reagieren

Der ursprüngliche Beitrag von 02:28 Uhr wurde um 02:37 Uhr ergänzt:

Hier mein Code snippet der nur auf einen Touchevent reagiert:

PHP:
int pID=-1,pIDIndex;


@Override
public boolean onTouch (MotionEvent evt)
{
    super.onTouch(evt);
    int curPID=evt. getPointerID(0);

    switch (evt.getAction ())
    {
        case MotionEvent.ACTION_DOWN:
            if (pID==-1)
            {
                pID=curPID;
                ...;
            }
            break;
        case MotionEvent.ACTION_MOVE:
            if (pID==curPID)
            {
                   ...;
            }
            break;
        case MotionEvent. ACTION_UP:            
            if (pID==curPID )
            {
                   pID=-1;
                   ...;
            }
            break;
    }

    return true;
}


Es ist aber noch ungetestet.
 
Zuletzt bearbeitet:
Hey also heir der code der auch wirklioch funktioniert:

Er akzeptiert nur ein Touch auf die Oberfläche und sperrt solange nachdem der erste Touch losgelassen wurde, wenn mehrere Touches währenddessen erfolgt sind oder danach noch erfolgen und gibt alles erst wieder frei wenn die Oberfläche gerade keinen Touch erfährt.(Mit sperren meine Ich dass er euren Code den Ihr in "..." einsetzt nicht ausgeführt wird)

Hier:

PHP:
int pID=-1;
public void mainModeTouch(MotionEvent e)
{
    switch(e.getAction())
    {
        case MotionEvent.ACTION_DOWN:

                if(pID!=-1)
                    break;

                pID=e.getPointerId(e.getActionIndex());

                ...

                break;
		  		
        case MotionEvent.ACTION_MOVE:

                if(pID==-1)
                    break;

                ...

                break;
		  		
        case MotionEvent.ACTION_POINTER_UP:
        case MotionEvent.ACTION_UP:

                if(pID==-1||e.getActionIndex()!=e.findPointerIndex(pID))
                    break;

                pID=-1;

                ...

                break;
 
Zuletzt bearbeitet:

Ähnliche Themen

S
Antworten
7
Aufrufe
1.152
swa00
swa00
D
Antworten
14
Aufrufe
1.698
chrs267
chrs267
M
Antworten
3
Aufrufe
144
moin
M
Zurück
Oben Unten