Hi,
Ich versuche gerade eine Zoom Funktion für ein ScrollPane zu implementieren.
Dabei will ich sicherstellen, dass der Punkt unter der Mouse nach dem Skalieren auch
unter der Mouse bleibt.
Meine Überlegung:
s.x,s.y seien die Koordinaten des Viewport
m.x,m.y seien die Koordinaten der Mouse Relativ zum ScrollPane
Dann ist der Punkt, dessen Position gleich bleiben soll, gegeben durch (s.x+m.x),(s.y+m.y).
Wenn ich also um den Faktor 10% Zoome, bekommt dieser Punkt die Koordinaten (s.x+m.x)*0.9,(s.y+m.y)*0.9 bzw. (s.x+m.x)*1.1,(s.y+m.y)*1.1.
Damit dieser Punkt unter der Mouse bleibt muss der Viewport also doch auf
(s.x+m.x)*0.9-m.x,(s.y+m.y)*0.9-m.y setzten oder?
Anbei die Methode die dies Implementieren sollte.
Das Verhalten das ich auf diese Art erreiche ist leider nicht die erwartete :/.
Ich hoffe ihr könnt mir weiterhelfen und meinen Fehler erklären und einen lösungsvorschlag geben.
Danke
mfg daMSTRin
Ich versuche gerade eine Zoom Funktion für ein ScrollPane zu implementieren.
Dabei will ich sicherstellen, dass der Punkt unter der Mouse nach dem Skalieren auch
unter der Mouse bleibt.
Meine Überlegung:
s.x,s.y seien die Koordinaten des Viewport
m.x,m.y seien die Koordinaten der Mouse Relativ zum ScrollPane
Dann ist der Punkt, dessen Position gleich bleiben soll, gegeben durch (s.x+m.x),(s.y+m.y).
Wenn ich also um den Faktor 10% Zoome, bekommt dieser Punkt die Koordinaten (s.x+m.x)*0.9,(s.y+m.y)*0.9 bzw. (s.x+m.x)*1.1,(s.y+m.y)*1.1.
Damit dieser Punkt unter der Mouse bleibt muss der Viewport also doch auf
(s.x+m.x)*0.9-m.x,(s.y+m.y)*0.9-m.y setzten oder?
Anbei die Methode die dies Implementieren sollte.
Java:
private void jScrollPaneMouseWheelMoved(MouseWheelEvent evt) {
viewPosition = jScrollPane.getViewport().getViewPosition();
Point mousepos=jScrollPane.getMousePosition(true);
scale = scale + evt.getWheelRotation() * 0.10f;
if (1 > scale && scale > 0.20f) {
if (evt.getWheelRotation() > 0) {
jScrollPane.getViewport().setViewPosition(new Point((int) ((viewPosition.x+mousepos.x) * 0.90f)-mousepos.x, (int) (((viewPosition.y+mousepos.y) * 0.90f))-mousepos.y));
} else if (evt.getWheelRotation() < 0) {
jScrollPane.getViewport().setViewPosition(new Point((int) (((viewPosition.x+mousepos.x) * 1.10f))-mousepos.x, (int) ((viewPosition.y+mousepos.y) * 1.10f)-mousepos.y));
}
} else if (scale <= 0.20f) {
scale = 0.15f;
} else if (scale >= 1.0f) {
scale = 1.0f;
}
bild.setScale(scale);
bild.repaint();
}
Das Verhalten das ich auf diese Art erreiche ist leider nicht die erwartete :/.
Ich hoffe ihr könnt mir weiterhelfen und meinen Fehler erklären und einen lösungsvorschlag geben.
Danke
mfg daMSTRin