Multitouch geht nicht

Fr4gg0r

Fr4gg0r

App-Anbieter (Werbung)
465
Hi,
irgendwie klappt bei mir der Multitouch zoom nicht und ich weiß nicht warum. =/
Code:
public boolean onTouchEvent(MotionEvent event){
	switch(event.getPointerCount()){
	case 1:
		switch(event.getAction()){
		case 0: //ACTION_DOWN
			break;
		}
		break;
	case 2:
		final int x = (int) event.getX(0);
		final int y = (int) event.getY(0);
		final int x2 = (int) event.getX(1);
		final int y2 = (int) event.getY(1);
		switch(event.getAction()){
		case 0: //ACTION_DOWN
			multitouchDistance = (int) Math.sqrt((x - x2) * (x - x2) + (y - y2) * (y - y2));
			scrollSpeed = 0;
			break;
		case 2: //ACTION_MOVE
			int newDistance = (int) Math.sqrt((x - x2) * (x - x2) + (y - y2) * (y - y2));
			textSize  -= multitouchDistance  - newDistance;
			multitouchDistance = newDistance;
			textPaint.setTextSize(textSize);
			invalidate();
			break;
		}
	}
	return true;
}

Während man beide Finger bewegt klappt alles wie es soll.
Will man jedoch den Text noch kleiner haben würde man die Finger hochnehmen und neuansetzen und dann ist der Text plötzlich bei der ersten Bewegung wieder ganz groß.
 
Ist das nicht irgendwie logisch?
Genau das steht ja auch im Code :p

Ich hoffe mal dir reicht als Erklärung wenn ich dir sage das du die Text-Größe absolut setzt und nicht relativ?

Code:
public boolean onTouchEvent(MotionEvent event){
	switch(event.getPointerCount()){
	case 1:
		switch(event.getAction()){
		case 0: //ACTION_DOWN
			break;
		}
		break;
	case 2:
		final int x = (int) event.getX(0);
		final int y = (int) event.getY(0);
		final int x2 = (int) event.getX(1);
		final int y2 = (int) event.getY(1);
		switch(event.getAction()){
		case 0: //ACTION_DOWN
			multitouchDistance = (int) Math.sqrt((x - x2) * (x - x2) + (y - y2) * (y - y2));
			[B]startTextSize = textPaint.getTextSize(textSize); //int startTextSize muss außerhalb erst definiert werden![/B]
			scrollSpeed = 0;
			break;
		case 2: //ACTION_MOVE
			int newDistance = (int) Math.sqrt((x - x2) * (x - x2) + (y - y2) * (y - y2));
			[B]textSize  = startTextSize*(multitouchDistance- newDistance)/multitouchDistance;
			// multitouchDistance = newDistance;[/B]
			textPaint.setTextSize(textSize);
			invalidate();
			break;
		}
	}
	return true;
}

Musst nur 3 Zeilen ändern (okay, 4, mit der Definition von startTextSize), ich hoffe mal du hast nicht schon die Lösung ;)
Ansonsten gefällt mir der Code aber echt gut, hab über so was noch nie nachgedacht und das ist einfach ...schön ^^
 
Zuletzt bearbeitet:
Also ein Fehler war die Verwendung von ACTION_DOWN, stattdessen sollte man ACTION_POINTER_DOWN verwenden.
Das seltsame ist, bei mir wird ACTION_POINTER_DOWN nie aufgerufen. :rolleyes:
Wodurch es bei deiner Version zu einem divide by zero kommt. =/

Btw: Du meintest ja, ich würde die Textgröße absolut setzen, jedoch wird textSize durch das "-=" meiner Meinung nach relativ verändert.
 
Zuletzt bearbeitet:
Hm, stimmt...
wirklich relativ ist es aber trotzdem nicht :p
Bei meiner Methode wird der Text doppelt so groß wenn du die Finger doppelt so weit auseinander nimmst. Bei deiner wird es bei jedem Schritt um den selben absoluten Wert verkleinert, dürfte die Form einer Wurzelfunktion oder so haben... aber ist ja auch egal.
Aber dann liegt es wohl bei beiden Methoden daran das ACTION_POINTER_DOWN nicht aufgerufen wird...

Edit: Kannst du deinen veränderten Code nochmal zeigen?
 
Zuletzt bearbeitet:
Code:
case 2:
        final int x2 = (int) event.getX(1);
	final int y2 = (int) event.getY(1);
	switch(event.getAction()){
	case 5: //ACTION_POINTER_DOWN
	       multitouchDistance = (int) Math.sqrt((x - x2) * (x - x2) + (y - y2) * (y - y2));
	       Log.d("distance", Float.toString(multitouchDistance));
	       break;
        case 2: //ACTION_MOVE
	        int newDistance = (int) Math.sqrt((x - x2) * (x - x2) + (y - y2) * (y - y2));
	        textSize  -= (multitouchDistance  - newDistance);
	        if(textSize < 8)textSize = 8;
	        if(textSize > 20)textSize = 30;
	        textPaint.setTextSize(textSize);
	        //..noch ein paar berechnungen
        	multitouchDistance = newDistance;
        	invalidate();	
        	break;
}			
}

Also action_pointer_down wird nur selten unter irgendwelchen Umständen aufgerufen, die sich mir nicht erschließen.
 
Ich hab es mittlerweile gelöst.
Mit
if(action == ACTION_POINTER_1_DOWN || ACTION_POINTER_2_DOWN)
funktioniert es.

public static final int ACTION_POINTER_DOWN

Since: API Level 5
A non-primary pointer has gone down.

Finde die Beschreibung doch sehr unpassend, denn es ist äquivalent zu ACTION_POINTER_1_DOWN.
 
Zuletzt bearbeitet:
Sehr seltsam. Aber gut das du es hinbekommen hast :)
 

Ähnliche Themen

SaniMatthias
Antworten
19
Aufrufe
871
swa00
swa00
O
Antworten
15
Aufrufe
2.871
ORHUX
O
S
Antworten
8
Aufrufe
796
stikker
S
Zurück
Oben Unten