JScrollPane - Zoom relativ zu Maus-position
Brauche ich zur Berechnung der neuen position des Viewports beim Zoomen in ein Bild.
Die UI ist wie folgt aufgebaut:
- ImagePanel zeichnet das Bild
- ImagePanelWrapper ist ein JPanel umwickeln der imagePanel
- JScrollPane enthält die ImagePanelWrapper
Beim Zoomen in oder out, das ImagePanel ist der zoom-Faktor geändert wird und die bevorzugte Größe der ImagePanel wird neu berechnet. Somit wird das Bild auf das panel bewegt, obwohl das ImagePanel bleibt an der gleichen viewport Punkt.
Werden die folgenden Methoden aufgerufen, wenn der Benutzer hält die STRG-Taste gedrückt und benutzt das Maus-Rad. Die gegeben point wird die Cursorposition zur Verfügung gestellt von der MouseWheelListener. Mit den Funktionen in diesen Methoden das Bild ist schon der Aufenthalt in der gleichen top-Links-position beim Zoomen in oder out.
Das problem ist, dass ich einfach nicht herausfinden wie Sie sich bewegen, relativ zu der Maus, wie Paint.NET zum Beispiel. Irgendwelche Ideen?
/**
*
*/
public void zoomOut(Point point) {
this.imagePanel.setZoom(this.imagePanel.getZoom() * 0.9f);
Point pos = this.getViewport().getViewPosition();
int newX = (int) (pos.x * 0.9f);
int newY = (int) (pos.y * 0.9f);
this.getViewport().setViewPosition(new Point(newX, newY));
this.imagePanel.revalidate();
this.imagePanel.repaint();
}
/**
*
*/
public void zoomIn(Point point) {
this.imagePanel.setZoom(this.imagePanel.getZoom() * 1.1f);
Point pos = this.getViewport().getViewPosition();
int newX = (int) (pos.x * 1.1f);
int newY = (int) (pos.y * 1.1f);
this.getViewport().setViewPosition(new Point(newX, newY));
this.imagePanel.revalidate();
this.imagePanel.repaint();
}
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn diese Annahmen wahr sind:
Dann der viewport kann so eingestellt werden, dass der cursor über dem gleichen Punkt im Bild vor und nach dem zoom-Vorgang, wenn verschoben, in der folgenden Weise:
Hier ist die Mathematik der Vollständigkeit halber:
Sollten Sie in der Lage sein, um die Position des Mauszeigers mit
point.x
undpoint.y
- siehe diePoint
Dokumentation hier. Accouding derMouseMotionEvent
Dokumentation hier, diepoint.x
undpoint.y
sind relativ zur Komponente unter dem Mauszeiger befindet (dieJScrollPane
).Können Sie übernehmen Sie diese Werte in Ihre Berechnung. Ist dies ein bisschen, was Sie gesucht haben?