国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【Java AWT 圖形界面編程】使用鼠標(biāo)滾輪縮放 Canvas 畫布中繪制的背景圖像 ( 繪制超大圖像 + 鼠標(biāo)拖動(dòng) + 鼠標(biāo)滾輪縮放 + 以當(dāng)前鼠標(biāo)指針位置為縮放中心 示例 )

這篇具有很好參考價(jià)值的文章主要介紹了【Java AWT 圖形界面編程】使用鼠標(biāo)滾輪縮放 Canvas 畫布中繪制的背景圖像 ( 繪制超大圖像 + 鼠標(biāo)拖動(dòng) + 鼠標(biāo)滾輪縮放 + 以當(dāng)前鼠標(biāo)指針位置為縮放中心 示例 )。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。





一、鼠標(biāo)滾輪縮放的中心點(diǎn)設(shè)置為當(dāng)前鼠標(biāo)中心點(diǎn) - 要點(diǎn)分析



鼠標(biāo)指針指向界面中的 Canvas 畫布某個(gè)位置 , Canvas 畫布中繪制著一張超大圖片 , 以該位置為中心 , 滑動(dòng)鼠標(biāo)滾輪時(shí)進(jìn)行縮放 ;

使用鼠標(biāo)滾輪縮放后 , 在 Canvas 中繪制的圖片的尺寸肯定是放大或者縮小了 , 尺寸發(fā)生了改變 ;

圖片縮放時(shí) , 鼠標(biāo)指針指向一個(gè)位置 , 該位置對(duì)應(yīng)著一個(gè)當(dāng)前 Canvas 畫布中的 x, y 坐標(biāo) , 同時(shí)可以計(jì)算出當(dāng)前位置對(duì)應(yīng)的圖片中的 水平方向的比例 和 垂直方向的比例 ;

在縮放后的圖片中 , 只要保證鼠標(biāo)指針指向相同的 x, y 坐標(biāo)時(shí) , 該位置對(duì)應(yīng)的 水平方向的比例 和 垂直方向的比例 仍然保持不變 , 那就需要移動(dòng)圖片的位置 ;

  • 如果放大圖片就需要將圖片往左上方移動(dòng) ;
  • 如果縮小圖片就需要將圖片往右下方移動(dòng) ;

此時(shí)可以分析出 , 如果要實(shí)現(xiàn) 鼠標(biāo)滾輪縮放的中心點(diǎn)設(shè)置為當(dāng)前鼠標(biāo)中心點(diǎn) , 需要進(jìn)行下面兩個(gè)步驟的操作 :

  • 保存當(dāng)前鼠標(biāo)指針指向的位置 , 以及鼠標(biāo)指針指向位置對(duì)應(yīng)圖片中坐標(biāo)位置的比例 ;
  • 鼠標(biāo)指針指向的位置不變 , 指向圖片坐標(biāo)比例不變 , 圖片尺寸發(fā)生了改變 , 重新計(jì)算當(dāng)前圖片的放置位置 , 并設(shè)置圖片位置 ;

這樣圖片縮放時(shí) , 始終可以保證鼠標(biāo)指向的部位保持位置不變 ;


1、保存當(dāng)前鼠標(biāo)指針指向的位置


首先 , 在類中定義如下成員字段 ,

  • pointer_x 和 pointer_y 記錄的是鼠標(biāo)指針指向的界面中 Camvas 畫布中的坐標(biāo)位置 ;
  • pointer_ratio_x 和 pointer_ratio_y 記錄的是 鼠標(biāo)指針指向位置對(duì)應(yīng)圖片中坐標(biāo)位置的比例 ;
    public double pointer_ratio_x;
    public double pointer_ratio_y;

    public int pointer_x;
    public int pointer_y;

然后 , 在鼠標(biāo)縮放之前 , 保存當(dāng)前的鼠標(biāo)位置及比例 ;

  • 在鼠標(biāo)滾輪事件 MouseWheelEvent 中 , 可以直接通過(guò)調(diào)用 e.getX(), e.getY() 獲取到當(dāng)前 鼠標(biāo)指針 在 Canvas 畫布的坐標(biāo) ;
  • 根據(jù)該 Canvas 中的坐標(biāo) , 以及畫布的偏移 , 可以計(jì)算出該坐標(biāo)對(duì)應(yīng)圖片中的坐標(biāo)位置 ;
        // 計(jì)算畫布
        double canvasX = x - offsetX;
        double canvasY = y - offsetY;
  • 計(jì)算出當(dāng)前的圖片大小 ;
        // 計(jì)算圖片大小
        double imageWidth = image.getWidth(null) * scale;  // 縮放后的圖像寬度
        double imageHeight = image.getHeight(null) * scale;  // 縮放后的圖像高度
  • 有了鼠標(biāo)指針在圖片中的位置 , 圖片的尺寸 , 就可以計(jì)算出鼠標(biāo)指針在圖片中的比例 ;
        // 計(jì)算比例
        pointer_ratio_x = canvasX / imageWidth ;
        pointer_ratio_y = canvasY / imageHeight ;

完整代碼示例 :

    /**
     * 記錄滾輪縮放時(shí)鼠標(biāo)指針狀態(tài)
     */
    public void save(int x, int y){
        // 記錄鼠標(biāo)坐標(biāo)
        pointer_x = x;
        pointer_y = y;

        // 計(jì)算畫布
        double canvasX = x - offsetX;
        double canvasY = y - offsetY;

        // 計(jì)算圖片大小
        double imageWidth = image.getWidth(null) * scale;  // 縮放后的圖像寬度
        double imageHeight = image.getHeight(null) * scale;  // 縮放后的圖像高度

        // 計(jì)算比例
        pointer_ratio_x = canvasX / imageWidth ;
        pointer_ratio_y = canvasY / imageHeight ;
    }

2、根據(jù)鼠標(biāo)指針指向的位置以及比例重新計(jì)算圖片位置


在鼠標(biāo)滾輪縮放完成后 , 再根據(jù)鼠標(biāo)指針指向的位置和比例 , 結(jié)合圖片縮放后的尺寸 , 重新計(jì)算畫布偏移的位置 , 以達(dá)到鼠標(biāo)指向的圖片元素位置基本保持不變的目的 ;

    /**
     * 計(jì)算新的比例
     */
    public void restore(){
        // 縮放后的尺寸
        double imageWidth = image.getWidth(null) * scale;  // 縮放后的圖像寬度
        double imageHeight = image.getHeight(null) * scale;  // 縮放后的圖像高度

        // 計(jì)算整張畫布寬度
        double canvasX = imageWidth * pointer_ratio_x;
        double canvasY = imageHeight * pointer_ratio_y;

        // 計(jì)算畫布偏移
        offsetX = (int) (pointer_x - canvasX);
        offsetY = (int) (pointer_y - canvasY);
    }




二、繪制超大圖像 + 鼠標(biāo)拖動(dòng) + 鼠標(biāo)滾輪縮放 + 以當(dāng)前鼠標(biāo)指針位置為縮放中心 示例



在 【Java AWT 圖形界面編程】Canvas 中繪制超大圖片 ( 使用鼠標(biāo)拖動(dòng)查看全圖 | 設(shè)置 JFrame 窗口自動(dòng)關(guān)閉 | 獲取并繪制圖片 | 鼠標(biāo)拖動(dòng)計(jì)算位移 | 畫布偏移 ) 博客中 , 繪制了超大圖像 , 可以使用鼠標(biāo)拖動(dòng) ;

在 【Java AWT 圖形界面編程】使用鼠標(biāo)滾輪放大縮小 Canvas 畫布 ( 鼠標(biāo)滾輪事件監(jiān)聽器 MouseWheelListener ) 博客中 , 新增鼠標(biāo)滾輪縮放畫布示例 , 但是使用鼠標(biāo)拖動(dòng)時(shí) , 拖動(dòng)的效果也隨之縮放, 如 縮小畫布后 , 移動(dòng)鼠標(biāo) , 移動(dòng)距離對(duì)應(yīng)的縮放效果也隨之縮小 ;

在 【Java AWT 圖形界面編程】使用鼠標(biāo)滾輪放大縮小 Canvas 畫布中繪制的背景圖像 ( 鼠標(biāo)滾輪事件監(jiān)聽器 MouseWheelListener | Canvas 中繪制圖像并設(shè)置圖像大小 ) 博客中 , 使用縮放背景圖像的方式 , 實(shí)現(xiàn)縮放效果 , 并同時(shí)福袋鼠標(biāo)指針拖拽效果 ;

本博客中實(shí)現(xiàn)的案例 , 在上面的基礎(chǔ)上 , 添加了鼠標(biāo)滾輪縮放的中心點(diǎn)設(shè)置為當(dāng)前鼠標(biāo)中心點(diǎn) ;


1、代碼示例


import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseWheelEvent;
import java.awt.event.MouseWheelListener;

public class LargeCanvas extends JPanel {

    // 鼠標(biāo)按下時(shí)的坐標(biāo) 以及 更新后的坐標(biāo)
    private int startX, startY;

    // 當(dāng)前的位置偏移
    private int offsetX = 0, offsetY = 0;

    // 縮放比例,默認(rèn)為 1.0
    private double scale = 1.0;

    private Image image;

    public double pointer_ratio_x;
    public double pointer_ratio_y;

    public int pointer_x;
    public int pointer_y;

    public LargeCanvas() {
        // 畫布大小設(shè)置為 800 x 600
        // 繪制的圖片是 2K 大小的圖片
        setPreferredSize(new Dimension(800, 600));

        // 添加鼠標(biāo)滾輪監(jiān)聽器
        addMouseWheelListener(new MouseWheelListener() {
            @Override
            public void mouseWheelMoved(MouseWheelEvent e) {
                // 保存當(dāng)前的鼠標(biāo)位置及比例
                save(e.getX(), e.getY());
                int notches = e.getWheelRotation();
                if (notches < 0) {
                    // 滾輪向上,放大畫布
                    scale *= 1.1;
                } else {
                    // 滾輪向下,縮小畫布
                    scale /= 1.1;
                }
                // 基于鼠標(biāo)位置和比例, 計(jì)算最新的偏移
                restore();
                repaint();  // 重新繪制畫布
            }
        });

        // 為組件設(shè)置鼠標(biāo)監(jiān)聽事件
        addMouseListener(new MouseAdapter() {
            public void mousePressed(MouseEvent e) {
                // 記錄鼠標(biāo)按下時(shí)的坐標(biāo)
                startX = e.getX();
                startY = e.getY();
            }
        });

        // 添加鼠標(biāo)動(dòng)作監(jiān)聽
        addMouseMotionListener(new MouseAdapter() {
            // 鼠標(biāo)拖動(dòng)事件
            public void mouseDragged(MouseEvent e) {
                // 統(tǒng)計(jì)本次鼠標(biāo)移動(dòng)的相對(duì)值
                int dx = e.getX() - startX;
                int dy = e.getY() - startY;

                // 偏移量累加
                offsetX += dx;
                offsetY += dy;

                // 重新繪圖
                repaint();

                // 記錄當(dāng)前拖動(dòng)后的位置
                startX += dx;
                startY += dy;
            }
        });
    }

    /**
     * 記錄滾輪縮放時(shí)鼠標(biāo)指針狀態(tài)
     */
    public void save(int x, int y){
        // 記錄鼠標(biāo)坐標(biāo)
        pointer_x = x;
        pointer_y = y;

        // 計(jì)算畫布
        double canvasX = x - offsetX;
        double canvasY = y - offsetY;

        // 計(jì)算圖片大小
        double imageWidth = image.getWidth(null) * scale;  // 縮放后的圖像寬度
        double imageHeight = image.getHeight(null) * scale;  // 縮放后的圖像高度

        // 計(jì)算比例
        pointer_ratio_x = canvasX / imageWidth ;
        pointer_ratio_y = canvasY / imageHeight ;
    }

    /**
     * 計(jì)算新的比例
     */
    public void restore(){
        // 縮放后的尺寸
        double imageWidth = image.getWidth(null) * scale;  // 縮放后的圖像寬度
        double imageHeight = image.getHeight(null) * scale;  // 縮放后的圖像高度

        // 計(jì)算整張畫布寬度
        double canvasX = imageWidth * pointer_ratio_x;
        double canvasY = imageHeight * pointer_ratio_y;

        // 計(jì)算畫布偏移
        offsetX = (int) (pointer_x - canvasX);
        offsetY = (int) (pointer_y - canvasY);
    }

    public void paintComponent(Graphics g) {
        super.paintComponent(g);

        // 畫布進(jìn)行整體偏移
        Graphics2D g2 = (Graphics2D)g;

        // 縮放畫布
        //g2.scale(scale, scale);

        // 拖動(dòng)畫布
        g2.translate(offsetX, offsetY);

        // 獲取圖片
        this.image = Toolkit.getDefaultToolkit().getImage("image.jpg");

        // 繪制圖形
        //g2.drawImage(image, 0, 0, this);

        // 繪制圖像
        int imageWidth = (int) (image.getWidth(null) * scale);  // 縮放后的圖像寬度
        int imageHeight = (int) (image.getHeight(null) * scale);  // 縮放后的圖像高度
        g2.drawImage(image, 0, 0, imageWidth, imageHeight, null);
    }

    public static void main(String[] args) {
        // 創(chuàng)建 JFrame 窗口
        JFrame frame = new JFrame("Large Canvas");

        // 設(shè)置窗口關(guān)閉行為 點(diǎn)擊右上角關(guān)閉按鈕 關(guān)閉窗口并退出應(yīng)用
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        // 創(chuàng)建畫布
        LargeCanvas canvas = new LargeCanvas();

        // 將畫布放入滾動(dòng)布局
        JScrollPane scrollPane = new JScrollPane(canvas);

        // 將滾動(dòng)布局放入窗口
        frame.getContentPane().add(scrollPane);

        // 窗口自適應(yīng)
        frame.pack();

        // 窗口設(shè)置可見
        frame.setVisible(true);
    }
}

2、執(zhí)行效果


執(zhí)行后 , 將圖像中船頭的 H 標(biāo)識(shí)放置在界面中心 ;
canvas中心縮放,Java AWT 圖形界面編程,java,開發(fā)語(yǔ)言,AWT,Swing,Canvas,原力計(jì)劃
將鼠標(biāo)指針放在 H 位置 , 縮放 , 發(fā)現(xiàn)此時(shí)縮放 , 就是以當(dāng)前鼠標(biāo)指針為中心進(jìn)行的縮放 ;

canvas中心縮放,Java AWT 圖形界面編程,java,開發(fā)語(yǔ)言,AWT,Swing,Canvas,原力計(jì)劃文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-556426.html

到了這里,關(guān)于【Java AWT 圖形界面編程】使用鼠標(biāo)滾輪縮放 Canvas 畫布中繪制的背景圖像 ( 繪制超大圖像 + 鼠標(biāo)拖動(dòng) + 鼠標(biāo)滾輪縮放 + 以當(dāng)前鼠標(biāo)指針位置為縮放中心 示例 )的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • canvas實(shí)現(xiàn)鼠標(biāo)滾輪滾動(dòng)縮放畫布

    canvas實(shí)現(xiàn)鼠標(biāo)滾輪滾動(dòng)縮放畫布效果

    2024年02月04日
    瀏覽(99)
  • Cesium 鼠標(biāo)滾輪事件獲取地圖縮放等級(jí)

    Cesium 監(jiān)聽鼠標(biāo)滾輪,滾輪每次滾動(dòng)獲取當(dāng)前地圖瓦片等級(jí)。 靈感來(lái)自:cesium獲取當(dāng)前地圖瓦片縮放級(jí)別_右弦GISer的博客-CSDN博客_cesium 獲取縮放級(jí)別 實(shí)際使用時(shí)體驗(yàn)并不好,最后使用監(jiān)聽高度的方法。

    2024年02月11日
    瀏覽(123)
  • 243:vue+Openlayers 更改鼠標(biāo)滾輪縮放地圖大小,每次縮放小一點(diǎn)

    243:vue+Openlayers 更改鼠標(biāo)滾輪縮放地圖大小,每次縮放小一點(diǎn)

    第243個(gè) 點(diǎn)擊查看專欄目錄 本示例的目的是介紹如何在vue+openlayers項(xiàng)目中設(shè)置鼠標(biāo)滾輪縮放地圖大小,每次滑動(dòng)一格滾輪,設(shè)定的值非默認(rèn)值1。具體的設(shè)置方法,參考源代碼。 直接復(fù)制下面的 vue+openlayers源代碼,操作2分鐘即可運(yùn)行實(shí)現(xiàn)效果 示例效果

    2024年02月09日
    瀏覽(117)
  • Proe 5.0鼠標(biāo)滾輪無(wú)法縮放的解決方法

    Proe 5.0鼠標(biāo)滾輪無(wú)法縮放的解決方法

    鼠標(biāo)中鍵(也就是滾輪)在軟件里起“確認(rèn)”功能,滾輪上下滑動(dòng)可以進(jìn)行縮放,沒反應(yīng)的話解決辦法如下: 1.win+i打開設(shè)置界面 ?2.在設(shè)備選項(xiàng)中選擇鼠標(biāo)按鍵,將懸停在·非活動(dòng)窗口滾動(dòng)選項(xiàng)關(guān)閉 ?3.然后就可以進(jìn)行縮放了 ?4.按住滾輪可以旋轉(zhuǎn)零件 shift+滾輪按住不放還可

    2024年02月12日
    瀏覽(92)
  • vue 拖動(dòng)、縮放容器組件,支持移動(dòng)端雙指縮放和PC端鼠標(biāo)滾輪縮放

    本組件基于CSS的transform實(shí)現(xiàn)。移動(dòng)端監(jiān)聽touch事件(單指移動(dòng),雙指移動(dòng)+縮放),PC端監(jiān)聽mouse事件(移動(dòng))和滾動(dòng)事件wheel(縮放),更新transform的translateX/translateY/scale值,從而實(shí)現(xiàn)縮放、移動(dòng)。由于transform不會(huì)產(chǎn)生重排,因此不節(jié)流也可以有很好的性能,用戶體驗(yàn)就像德芙

    2024年02月03日
    瀏覽(93)
  • Canvas鼠標(biāo)滾輪縮放以及畫布拖動(dòng)(圖文并茂版)

    Canvas鼠標(biāo)滾輪縮放以及畫布拖動(dòng)(圖文并茂版)

    本文會(huì)帶大家認(rèn)識(shí)Canvas中常用的坐標(biāo)變換方法 translate 和 scale,并結(jié)合這兩個(gè)方法,實(shí)現(xiàn)鼠標(biāo)滾輪縮放以及畫布拖動(dòng)功能。 Canvas 繪圖的縮放以及畫布拖動(dòng)主要通過(guò) CanvasRenderingContext2D 提供的 translate 和 scale 兩個(gè)方法實(shí)現(xiàn)的,先來(lái)認(rèn)識(shí)下這兩個(gè)方法。 translate 方法 語(yǔ)法: trans

    2023年04月09日
    瀏覽(98)
  • js 以鼠標(biāo)滾輪位置為中心縮放、放大以及邊界判斷

    js 以鼠標(biāo)滾輪位置為中心縮放、放大以及邊界判斷

    項(xiàng)目需求為頁(yè)面上實(shí)現(xiàn)拖拽節(jié)點(diǎn)和可以在頁(yè)面中通過(guò)滑動(dòng)滾輪來(lái)縮放節(jié)點(diǎn)顯示(以鼠標(biāo)位置為縮放中心點(diǎn))從而放大到可以看到詳細(xì)的信息,節(jié)點(diǎn)有10000個(gè)。特此記錄下實(shí)現(xiàn)細(xì)節(jié) 初始化變量 為節(jié)點(diǎn)綁定拖拽事件,拖拽事件的邊界使用 Math 進(jìn)行判斷,比起 if 判斷更加清晰快捷

    2024年02月11日
    瀏覽(89)
  • Echarts map3D 禁止鼠標(biāo)滾輪縮放

    Echarts type為map3D 在使用時(shí)發(fā)現(xiàn)會(huì)存在鼠標(biāo)滾輪縮放的情況 zoomSensitivity屬性本質(zhì)上是是否開啟map3D的縮放和平移 所以也可以禁止鼠標(biāo)滾輪縮放的情況 禁用這個(gè)屬性就可以實(shí)現(xiàn)map3D 禁止鼠標(biāo)滾輪縮放的需求了

    2024年02月15日
    瀏覽(89)
  • Fabric.js+vue 實(shí)現(xiàn)鼠標(biāo)滾輪縮放畫布+移動(dòng)畫布

    話不多說(shuō) 直接貼代碼 一、實(shí)現(xiàn)鼠標(biāo)滾輪縮放畫布 使用說(shuō)明,我的canvas畫布定義為 canvas,替他均不用額外設(shè)置變量。canvas = new fabric.Canvas(\\\'editorCanvas\\\', {... 二、實(shí)現(xiàn)鼠標(biāo)按下變抓手,并可移動(dòng)畫布中內(nèi)容 使用說(shuō)明:data中定義panning: false,用來(lái)標(biāo)記鼠標(biāo)按下狀態(tài)(是否鼠標(biāo)按下)

    2024年02月09日
    瀏覽(92)
  • unity3D 鼠標(biāo)滾輪實(shí)現(xiàn)物體的大小縮放

    鼠標(biāo)滾輪響應(yīng)函數(shù)是Input.GetAxis(\\\"Mouse ScrollWheel\\\"),函數(shù)返回值類型是float,向前滾是返回正數(shù),向后滾是返回負(fù)數(shù),且鼠標(biāo)滾輪滑動(dòng)單次函數(shù)返回值為0.1 利用返回值修改模型transform.localscale,實(shí)現(xiàn)模型縮放 鼠標(biāo)滾輪一直向后滾,會(huì)看見模型逐漸變小,當(dāng)變到很小到消失的時(shí)候,

    2024年02月08日
    瀏覽(96)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包