如何使该面板向面板中间缩放?

如何使该面板向面板中间缩放?,第1张

如何使该面板向面板中间缩放

因此,基本思想是,当您更改比例时,而不是允许整个更改被添加/减去宽度/高度,您需要在位置和尺寸之间进行划分…

public void mouseWheelMoved(MouseWheelEvent e) {    int notches = e.getWheelRotation();    // Get the current/old size...        double oldWidth = image.getWidth() * scaleFactor;    double oldHeight = image.getHeight() * scaleFactor;    scaleFactor = scaleFactor + notches / 10.0;    if (scaleFactor < 0.5) {        scaleFactor = 0.5;    } else if (scaleFactor > 3.0) {        scaleFactor = 3.0;    }    // Get the new size    double newWidth = image.getWidth() * scaleFactor;    double newHeight = image.getHeight() * scaleFactor;    // Calculate the difference (and divide it by 2)    double difWidth = (oldWidth - newWidth) / 2;    double difHeight = (oldHeight - newHeight) / 2;    // Add it to the image position...    imageX += difWidth;    imageY += difHeight;    revalidate();    repaint();}

更新了工作示例

好的,所以基本的想法是要处理图像所在的虚拟空间。该虚拟空间具有一个大小(组件大小x比例因子)。这使您可以将虚拟空间置于实际空间的中心。

之后,您只需要计算虚拟空间(在真实空间内)的x / y偏移量和图像的虚拟位置。

在此示例中,我删除了

AffineTransformation#setLocation
生成图像的缩放实例的支持,这只是使放置图像变得更加容易。

import java.awt.*;import javax.imageio.ImageIO;import javax.swing.*;import java.awt.event.*;import java.awt.geom.*;import java.awt.image.BufferedImage;import java.net.URL;public class MoveImageExample extends Jframe {    ShowCanvas canvas;    public MoveImageExample() throws Exception {        super();        Container container = getContentPane();        canvas = new ShowCanvas(  "http://cdn.smosh.com/sites/default/files/bloguploads/funny-iphone-5-bruce-lee.jpg");        container.add(canvas);        pack();        setVisible(true);    }    public static void main(String arg[]) throws Exception {        new MoveImageExample();    }}@SuppressWarnings("serial")final class ShowCanvas extends JPanel {    int imageX = 0, imageY = 0;    int lastMouseX = 0, lastMouseY = 0;    int centerX = 225;    int centerY = 225;    int canvasWidth = 450;    int canvasHeight = 450;    double scaleFactor = 1.0;    boolean firstMouseDrag = true;    BufferedImage image;    private BufferedImage scaled;    public ShowCanvas(String imagePath) throws Exception {        setBackground(Color.white);        MouseMotionHandler mouseHandler = new MouseMotionHandler();        addMouseMotionListener(mouseHandler);        addMouseListener(mouseHandler);        addMouseWheelListener(mouseHandler);        URL url = new URL(imagePath);        Image rawImage = ImageIO.read(url);        image = new BufferedImage(rawImage.getWidth(this),  rawImage.getHeight(this), BufferedImage.TYPE_INT_ARGB);        setSize(image.getWidth(), image.getHeight());        Graphics2D g2 = image.createGraphics();        g2.drawImage(rawImage, imageX, imageY, this);    }    @Override    public Dimension getPreferredSize() {        return new Dimension((int) (image.getWidth()), (int) (image.getHeight()));    }    protected BufferedImage getScaledInstance() {        if (scaled == null) { int width = (int) (image.getWidth() * scaleFactor); int height = (int) (image.getHeight() * scaleFactor); scaled = new BufferedImage(width, height, image.getType()); Graphics2D g2d = scaled.createGraphics(); AffineTransform transformer = new AffineTransform(); transformer.scale(scaleFactor, scaleFactor); // scale by 2x on x and y g2d.setTransform(transformer); g2d.drawImage(image, 0, 0, this); g2d.dispose();        }        return scaled;    }    public Dimension getVirtualSize() {        return new Dimension(  (int)(getWidth() * scaleFactor),   (int)(getHeight() * scaleFactor));    }    public Point getVirtualPoint(int x, int y) {        return new Point(  (int)(x * scaleFactor),  (int)(y * scaleFactor));    }    public void paintComponent(Graphics g) {        super.paintComponent(g);        Dimension vitualSize = getVirtualSize();        int xOffset = (getWidth() - vitualSize.width) / 2;        int yOffset = (getHeight() - vitualSize.height) / 2;        Graphics2D g2D = (Graphics2D) g.create();        g2D.setColor(Color.gray);        g.fillRect(0, 0, image.getWidth(), image.getHeight());        g2D.setColor(Color.GREEN);        g2D.drawRect(xOffset, yOffset, vitualSize.width, vitualSize.height);        g2D.setColor(Color.RED);        g2D.drawLine(getWidth() / 2, 0, getWidth() / 2, getHeight());        g2D.drawLine(0, getHeight() / 2, getWidth(), getHeight() / 2);        Point virtualPoint = getVirtualPoint(imageX, imageY);        System.out.println(virtualPoint);        g2D.drawImage(getScaledInstance(), virtualPoint.x + xOffset, virtualPoint.y + yOffset, this);        g2D.dispose();    }    class MouseMotionHandler extends MouseMotionAdapter implements         MouseListener, MouseWheelListener {        public void mousePressed(MouseEvent e) { lastMouseX = e.getX(); lastMouseY = e.getY();        }        public void mouseDragged(MouseEvent e) { int xDiff = e.getX() - lastMouseX; int yDiff = e.getY() - lastMouseY; imageX = imageX + xDiff; imageY = imageY + yDiff; lastMouseX = e.getX(); lastMouseY = e.getY(); repaint();        }        public void mouseWheelMoved(MouseWheelEvent e) { scaled = null; int notches = e.getWheelRotation(); scaleFactor = scaleFactor + notches / 10.0; if (scaleFactor < 0.5) {     scaleFactor = 0.5; } else if (scaleFactor > 3.0) {     scaleFactor = 3.0; } repaint();        }        public void mouseReleased(MouseEvent e) {        }        public void mouseEntered(MouseEvent e) {        }        public void mouseExited(MouseEvent e) {        }        public void mouseClicked(MouseEvent e) {        }    }}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5429448.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-11
下一篇 2022-12-11

发表评论

登录后才能评论

评论列表(0条)

保存