摆动图形执行缩放后更新图像位置

时间:2016-08-24 19:37:51

标签: java swing

我有以下表示图像位置的变量(图像可拖动):

private int translateX, translateY;

我使用paintComponent方法渲染图像:

@Override
public void paintComponent(Graphics g) {
    super.paintComponent(g);
    Graphics2D g2d = (Graphics2D) g;

    g2d.drawImage(image, (int) (translateX * zoom), (int) (translateY * zoom), (int) (image.getWidth() * zoom), (int) (image.getHeight() * zoom), null);
}

其中zoom是缩放量(分钟0.8),我将图像尺寸乘以缩放。

这就是我在控制器中处理缩放值的方法:

@Override
public void mouseWheelMoved(MouseWheelEvent e) {
    int delta = e.getWheelRotation();
    double temp = map.getZoom() - (delta * 0.1);
    temp = Math.max(temp, 0.8);
    temp = Math.max(temp, 0.8);
    if (temp != map.getZoom()) {
        map.setZoom(temp);
        map.repaint();
    }
}

这里发生的事情是,缩放效果很好,可以像它应该放大到中心,但我所拥有的是JPanel中有大小限制的大地图图像(getWidth()getHeight()并且当您拖动地图图像时,除非地图图像在那里,否则您不能离开面板边界,但如果它是地图图像宽度或高度的末尾,它将停在最大值,我这样做这些绑定计算:

public void translateSafely(int x, int y) {
        if (!(translateY + y > 0 || (translateY + y) * zoom < getHeight() - image.getHeight() * zoom)) {
            this.translateY += y;
        }
        if (!(translateX + x > 0 || (translateX + x) * zoom < getWidth() - image.getWidth() * zoom)) {
              this.translateX += x;
        }
        this.repaint();
}

getWidth()getHeight()是继承JPanel

的方法

如果地图通过计算地图宽度或高度以及面板宽度和高度在地图上结束,则可以使用限制拖动地图(通过添加拖动事件中的x和y)。

问题

如果您放大并向左拖动地图然后缩小,地图将超出边界(负x)并保持在那里,除非您有限制,否则您将无法将其移回放大并向右移动。

问题是,当我缩小时,如何让地图向后移动而没有跳跃?

问题的GIF样本:

https://gyazo.com/ba1d69f2720dee10a19ba65bdac0e81a

0 个答案:

没有答案