10

放大图像时,我需要计算视口的新位置。

UI的构建如下:

  • ImagePanel 绘制图像
  • ImagePanelWrapper 是一个包裹在 imagePanel 周围的 JPanel
  • JScrollPane 包含 ImagePanelWrapper

放大或缩小时,ImagePanel 的缩放系数会发生变化,并且会重新计算 ImagePanel 的首选大小。因此,即使 ImagePanel 保持在同一视口点,此面板上的图像也会移动。

当用户按住 CTRL 并使用鼠标滚轮时,将调用以下方法。给定点是 MouseWheelListener 提供的光标位置。借助这些方法中的功能,图像在放大或缩小时已经保持在相同的左上角位置。

问题是我不知道如何相对于鼠标移动,例如 Paint.NET。有任何想法吗?

/**
 * 
 */
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();
}
4

2 回答 2

38

如果这些假设是真的:

  • 提供的 Point 相对于视口的左上角。
  • 视口的尺寸小于底层的 ImagePanel。

然后可以调整视口,使光标在缩放操作之前和之后在图像中的同一点上,如果按以下方式移动:

 /**
 * 
 */
public void zoomOut(Point point) {
    this.imagePanel.setZoom(this.imagePanel.getZoom() * 0.9f);
    Point pos = this.getViewport().getViewPosition();

    int newX = (int)(point.x*(0.9f - 1f) + 0.9f*pos.x);
    int newY = (int)(point.y*(0.9f - 1f) + 0.9f*pos.y);
    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)(point.x*(1.1f - 1f) + 1.1f*pos.x);
    int newY = (int)(point.y*(1.1f - 1f) + 1.1f*pos.y);
    this.getViewport().setViewPosition(new Point(newX, newY));

    this.imagePanel.revalidate();
    this.imagePanel.repaint();
}

为了完整起见,这是数学:

在此处输入图像描述

于 2012-12-29T19:26:45.880 回答
2

您应该能够使用point.x和获取鼠标指针的位置point.y- 请参阅此处Point的文档。根据此处的文档,和是相对于鼠标下的组件()。MouseMotionEventpoint.xpoint.yJScrollPane

您可以将这些值合并到您的计算中。这有点像你要找的吗?

于 2012-10-31T10:14:11.433 回答