プロジェクト

全般

プロフィール

« | » 

リビジョン be89b40a

高徹 高橋 徹 さんがほぼ12年前に追加

マウスのドラッグ操作でのパン(スクロール)がうまくいっていないバグを修正

差分を表示:

learn/java/javafx/ZoomPanCanvas/src/zoompancanvas/ZoomPanCanvasController.java
public class ZoomPanCanvasController implements Initializable {
private static final Logger logger = Logger.getLogger(ZoomPanCanvasController.class.getName());
private static final Affine IDENTITY_TRANSFORM = new Affine(1f, 0f, 0f, 0f, 1f, 0);
private static final double RADIUS = 10_000f;
@FXML
......
@FXML
private Label scaleLabel;
private DoubleProperty scale = new SimpleDoubleProperty(1.0);
private double translateX;
private double translateY;
private Point2D dragStartPoint;
private Point2D translate = new Point2D(0f, 0f);
private Point2D prevDragPoint;
@FXML
private void handleButtonAction(ActionEvent event) {
......
public void initialize(URL url, ResourceBundle rb) {
scaleLabel.textProperty().bindBidirectional(scale, new NumberStringConverter());
canvas.setOnScroll(ev -> {
scale.set((ev.getDeltaY() >= 0) ? scale.get() * 2f : scale.get() / 2f);
scale.set((ev.getDeltaY() >= 0) ? scale.get() * 1.4f : scale.get() / 1.4f);
drawCanvas();
});
canvas.setOnMousePressed(ev -> {
dragStartPoint = new Point2D(ev.getSceneX(), ev.getSceneY());
logger.info("OnMousePressed, dragPoint(scene xy) is " + dragStartPoint);
prevDragPoint = new Point2D(ev.getSceneX(), ev.getSceneY());
logger.info(() -> String.format("OnMousePressed, sceneXY=(%f, %f)", ev.getSceneX(), ev.getSceneY()));
});
canvas.setOnMouseDragged(ev -> {
double deltaX = ev.getSceneX() - dragStartPoint.getX();
double deltaY = ev.getSceneY() - dragStartPoint.getY();
translateX += deltaX;
translateY += deltaY;
logger.info("onMouseDragged, moved is " + deltaX + "," + deltaY);
Point2D dragPoint = new Point2D(ev.getSceneX(), ev.getSceneY());
translate = translate.add(dragPoint.subtract(prevDragPoint));
prevDragPoint = dragPoint;
logger.info(() -> String.format("OnMouseDragged, sceneXY=(%f, %f), translate=%s",
ev.getSceneX(), ev.getSceneY(), translate));
drawCanvas();
});
}
private void drawCanvas() {
......
GraphicsContext gc = canvas.getGraphicsContext2D();
logger.info(() -> String.format("GraphicsContext's transform=%s%n", gc.getTransform().toString()));
clearCanvas();
gc.setTransform(getZoomPanTransform(scale.get(), translateX, translateY));
gc.setTransform(getZoomPanTransform(scale.get(), translate));
gc.setStroke(Color.DARKBLUE);
gc.setLineWidth(1 / scale.get());
gc.strokeLine(-RADIUS, 0, RADIUS, 0);
......
private void clearCanvas() {
GraphicsContext gc = canvas.getGraphicsContext2D();
gc.setTransform(getZoomPanTransform(1f, 0, 0));
gc.setTransform(IDENTITY_TRANSFORM);
gc.clearRect(0, 0, canvas.getWidth(), canvas.getHeight());
}
private Affine getZoomPanTransform(double scale, double tx, double ty) {
return new Affine(scale, 0, tx, 0, scale, ty);
private Affine getZoomPanTransform(double scale, Point2D translate) {
return new Affine(scale, 0, translate.getX(), 0, -scale, translate.getY());
}
}

他の形式にエクスポート: Unified diff