1. Nimm jetzt an unserem 2. ADVENT-Gewinnspiel teil - Alle Informationen findest Du hier!

Multitouch geht nicht

Dieses Thema im Forum "Android App Entwicklung" wurde erstellt von Fr4gg0r, 15.08.2010.

  1. Fr4gg0r, 15.08.2010 #1
    Fr4gg0r

    Fr4gg0r Threadstarter App-Anbieter (Werbung)

    Beiträge:
    2,506
    Erhaltene Danke:
    447
    Registriert seit:
    21.12.2009
    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ß.
     
  2. FelixL, 17.08.2010 #2
    FelixL

    FelixL Ehrenmitglied

    Beiträge:
    4,855
    Erhaltene Danke:
    754
    Registriert seit:
    26.11.2009
    Phone:
    Wileyfox Swift, HTC One M8
    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: 17.08.2010
  3. Fr4gg0r, 17.08.2010 #3
    Fr4gg0r

    Fr4gg0r Threadstarter App-Anbieter (Werbung)

    Beiträge:
    2,506
    Erhaltene Danke:
    447
    Registriert seit:
    21.12.2009
    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: 17.08.2010
  4. FelixL, 17.08.2010 #4
    FelixL

    FelixL Ehrenmitglied

    Beiträge:
    4,855
    Erhaltene Danke:
    754
    Registriert seit:
    26.11.2009
    Phone:
    Wileyfox Swift, HTC One M8
    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: 17.08.2010
  5. Fr4gg0r, 17.08.2010 #5
    Fr4gg0r

    Fr4gg0r Threadstarter App-Anbieter (Werbung)

    Beiträge:
    2,506
    Erhaltene Danke:
    447
    Registriert seit:
    21.12.2009
    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.
     
  6. FelixL, 18.08.2010 #6
    FelixL

    FelixL Ehrenmitglied

    Beiträge:
    4,855
    Erhaltene Danke:
    754
    Registriert seit:
    26.11.2009
    Phone:
    Wileyfox Swift, HTC One M8
  7. Fr4gg0r, 24.08.2010 #7
    Fr4gg0r

    Fr4gg0r Threadstarter App-Anbieter (Werbung)

    Beiträge:
    2,506
    Erhaltene Danke:
    447
    Registriert seit:
    21.12.2009
    Ich hab es mittlerweile gelöst.
    Mit
    if(action == ACTION_POINTER_1_DOWN || ACTION_POINTER_2_DOWN)
    funktioniert es.

    Finde die Beschreibung doch sehr unpassend, denn es ist äquivalent zu ACTION_POINTER_1_DOWN.
     
    Zuletzt bearbeitet: 24.08.2010
  8. FelixL, 24.08.2010 #8
    FelixL

    FelixL Ehrenmitglied

    Beiträge:
    4,855
    Erhaltene Danke:
    754
    Registriert seit:
    26.11.2009
    Phone:
    Wileyfox Swift, HTC One M8
    Sehr seltsam. Aber gut das du es hinbekommen hast :)
     

Diese Seite empfehlen