Zoomen mit ScaleGestureDetector - und dabei das Bild verschieben

afarber

afarber

Neues Mitglied
0
Guten Tag!

Ich bin ein Android-Anfänger und habe eine einfache App vorbereitet, in der man ein Spielfeld (Quellcode: MyView.java) scrollen und zoomen kann:

uniyr.jpg


In meinem Listener ändere ich Skalierungsfaktor:

Code:
public boolean onScale(ScaleGestureDetector detector) {
     mScale *= detector.getScaleFactor();
    
     // XXX mOffsetX und mOffsetY anpassen - aber wie?
    
     constrainZoom();
     constrainOffsets();
     invalidate();
             return true;
    }
Und dann male ich meine Komponente:

Code:
protected void onDraw(Canvas canvas) {
             super.onDraw(canvas);
    
                     canvas.translate(mOffsetX, mOffsetY);
                      canvas.scale(mScale, mScale);
                      gameBoard.setBounds(
                                       0, 
                                       0, 
                                       gameBoard.getIntrinsicWidth(),
                                       gameBoard.getIntrinsicHeight()
                      );
                      gameBoard.draw(canvas);  
    }
Es funktioniert eigentlich gut - bis auf ein kleines Problem.

Beim Zoomen mit zwei Fingern vergrössert sich das Spielfeld-Bild um den (falschen) Punkt 0, 0.

Und das wirkt unnatürlich - als ob beim Zoomen das Bild unter den Fingern weggleiten würde.

Ich denke es handelt sich um ein verbreitetes Problem und wahrscheinlich ist die Lösung dazu sehr einfach (etwa die mOffsetX und mOffsetY in onScale-Methode anpassen? dazu eventuell scale-Variable oder auch detector.getFocusX() verwenden?) - nur habe ich sie noch nicht finden können...

Gruss aus Bochum
Alex
 

Anhänge

  • MyView.txt
    6,5 KB · Aufrufe: 125
  • activity_main.txt
    470 Bytes · Aufrufe: 115
  • MainActivity.txt
    305 Bytes · Aufrufe: 110

Ähnliche Themen

B
Antworten
6
Aufrufe
1.049
jogimuc
J
M
  • MikelKatzengreis
Antworten
5
Aufrufe
116
swa00
swa00
B
Antworten
4
Aufrufe
470
bb321
B
Zurück
Oben Unten