JavaFX: получение правильных координат и размеров в imageView после масштабирования
У меня есть imageView внутри ScrollPane, и мне нужно реализовать функцию масштабирования. Я проверил этот код здесь и немного его отредактировал, потому что я не хочу делать масштабирование при прокрутке (я хочу, чтобы движение колесика мыши оставалось только для прокрутки изображения), поэтому я добавил 2 кнопки "Увеличить" и "Увеличить" OUT", и я использовал переменную"delta"вместо event.getDeltaY() в фильтре событий ScrollPane, и код теперь выглядит следующим образом:
Основной класс:
double delta = 0;
Zooming zoomElement = new Zooming();
Button zoomIn = new Button();
Button zoomOut = new Button();
zoomIn.setText("Zoom IN");
zoomIn.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
System.out.println("Zooming in, delta = " + delta);
zoomElement.zoom(imageView, scroller,delta, delta+10);
delta = delta + 10;
}
});
zoomOut.setText("Zoom OUT");
zoomOut.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
System.out.println("Zooming out, delta = " + delta);
zoomElement.zoom(imageView, scroller,delta, delta-10);
delta = delta - 10;
}
});
Класс масштабирования:
public class Zooming {
final DoubleProperty zoomProperty = new SimpleDoubleProperty(200);
public void zoom (ImageView imageView, ScrollPane scroller , double delta , double nextDelta){
zoomProperty.addListener(new InvalidationListener() {
@Override
public void invalidated(Observable arg0) {
imageView.setFitWidth(zoomProperty.get() * 4);
imageView.setFitHeight(zoomProperty.get() * 3);
}
});
if (delta < nextDelta) {
zoomProperty.set(zoomProperty.get() * 1.1);
} else if (delta > nextDelta) {
zoomProperty.set(zoomProperty.get() / 1.1);
}
}
}
Проблема в том, что я делаю измерения этого изображения, такие как координаты щелчка мыши и некоторые формы ширины и высоты. После масштабирования все эти измерения неверны, например, ширина сечения в изображении составляет 213,0, а после 4-кратного увеличения - 305,0.
Есть ли способ сохранить правильность этих измерений независимо от того, насколько сильно я увеличиваю изображение?
Код, используемый для измерения:
public static class RubberBandSelection {
final DragContext dragContext = new DragContext();
Rectangle rect = new Rectangle();
Group group;
public Bounds getBounds() {
return rect.getBoundsInParent();
}
public RubberBandSelection( Group group) {
this.group = group;
rect = new Rectangle( 0,0,0,0);
rect.setStroke(Color.BLUE);
rect.setStrokeWidth(1);
rect.setStrokeLineCap(StrokeLineCap.ROUND);
rect.setFill(Color.LIGHTBLUE.deriveColor(0, 1.2, 1, 0.6));
group.addEventHandler(MouseEvent.MOUSE_PRESSED, onMousePressedEventHandler);
group.addEventHandler(MouseEvent.MOUSE_DRAGGED, onMouseDraggedEventHandler);
group.addEventHandler(MouseEvent.MOUSE_RELEASED, onMouseReleasedEventHandler);
}
}
rubberBandSelection = new RubberBandSelection(imageLayer);
Bounds selectionBounds = rubberBandSelection.getBounds();
int width = (int) bounds.getWidth();
int height = (int) bounds.getHeight();
int xPressed = (int)bounds.getMinX();
int yPressed = (int)bounds.getMinY();