日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

java实现简单泡泡屏保动画及点击变实心泡泡

發(fā)布時(shí)間:2023/12/18 编程问答 48 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java实现简单泡泡屏保动画及点击变实心泡泡 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

工具類

package com.egeo.jframetext;import java.awt.*; import java.awt.geom.Ellipse2D;import java.lang.InterruptedException;public class AlgoVisHelper {private AlgoVisHelper(){}public static void strokeCircle(Graphics2D g, int x, int y, int r){Ellipse2D circle = new Ellipse2D.Double(x-r, y-r, 2*r, 2*r);g.draw(circle);}public static void fillCircle(Graphics2D g, int x, int y, int r){Ellipse2D circle = new Ellipse2D.Double(x-r, y-r, 2*r, 2*r);g.fill(circle);}public static void setColor(Graphics2D g, Color color){g.setColor(color);}public static void setStrokeWidth(Graphics2D g, int w){int strokeWidth = w;g.setStroke(new BasicStroke(strokeWidth, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND));}public static void pause(int t) {try {Thread.sleep(t);}catch (InterruptedException e) {System.out.println("Error sleeping");}}}

具體繪制類(視圖層)

package com.egeo.jframetext;import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.RenderingHints;import javax.swing.JFrame; import javax.swing.JPanel;public class AlgoFrame extends JFrame{private int canvasWidth;private int canvasHeight;public AlgoFrame(String title, int canvasWidth, int canvasHeight){//設(shè)置標(biāo)題super(title);//設(shè)置窗口寬度this.canvasWidth = canvasWidth;//設(shè)置窗口高度this.canvasHeight = canvasHeight;AlgoCanvas canvas = new AlgoCanvas();setContentPane(canvas);pack();setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);setResizable(false);setVisible(true);}public AlgoFrame(String title){this(title, 1024, 768);}public int getCanvasWidth(){return canvasWidth;}public int getCanvasHeight(){return canvasHeight;}//public JPanel getCanvas(){return canvas;}// dataprivate Circle[] circles;public void render(Circle[] circles){this.circles = circles;repaint();}private class AlgoCanvas extends JPanel{public AlgoCanvas(){// 雙緩存super(true);}@Overridepublic void paintComponent(Graphics g) {super.paintComponent(g);Graphics2D g2d = (Graphics2D)g;// 抗鋸齒RenderingHints hints = new RenderingHints(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);hints.put(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);g2d.addRenderingHints(hints);// 具體繪制AlgoVisHelper.setStrokeWidth(g2d,1);AlgoVisHelper.setColor(g2d, Color.RED);for(Circle circle: circles)//判斷是畫(huà)空心圓還是實(shí)心圓if(circle.isFilled)AlgoVisHelper.fillCircle(g2d, circle.x, circle.y, circle.getR());elseAlgoVisHelper.strokeCircle(g2d, circle.x, circle.y, circle.getR());}@Overridepublic Dimension getPreferredSize(){return new Dimension(canvasWidth, canvasHeight);}} }

圓實(shí)體類及邊緣碰撞邏輯處理

package com.egeo.jframetext;import java.awt.Point;public class Circle {public int x, y;private int r;public int vx, vy;public boolean isFilled = false;public Circle(int x, int y, int r, int vx, int vy){this.x = x;this.y = y;this.r = r;this.vx = vx;this.vy = vy;}public int getR() {return r;}public void move(int minx, int miny, int maxx, int maxy){x += vx;y += vy;checkCollision(minx, miny, maxx, maxy);}private void checkCollision(int minx, int miny, int maxx, int maxy){if(x - r < minx) { x = r; vx = -vx; }if(x + r >= maxx){ x = maxx - r; vx = -vx; }if(y - r < miny) { y = r; vy = -vy; }if(y + r >= maxy){ y = maxy - r; vy = -vy; }}public boolean contain(Point p){return (x - p.x) * (x - p.x) + (y - p.y) * (y - p.y) <= r * r;}}

控制層

package com.egeo.jframetext;import java.awt.EventQueue; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent;public class AlgoVisualizer {private Circle[] circles;private AlgoFrame frame;private boolean isAnimated = true;public AlgoVisualizer(int sceneWidth, int sceneHeight, int N){// 初始化數(shù)據(jù)circles = new Circle[N];int R = 50;for(int i = 0 ; i < N ; i ++){int x = (int)(Math.random()*(sceneWidth-2*R)) + R;int y = (int)(Math.random()*(sceneHeight-2*R)) + R;int vx = (int)(Math.random()*11) - 5;int vy = (int)(Math.random()*11) - 5;circles[i] = new Circle(x, y, R, vx, vy);}// 初始化視圖EventQueue.invokeLater(() -> {frame = new AlgoFrame("Welcome", sceneWidth, sceneHeight);//監(jiān)控鍵盤(pán)事件frame.addKeyListener(new AlgoKeyListener());//監(jiān)控鼠標(biāo)事件frame.addMouseListener(new AlgoMouseListener());new Thread(() -> {run();}).start();});}// 動(dòng)畫(huà)邏輯private void run(){while(true){// 繪制數(shù)據(jù)frame.render(circles);AlgoVisHelper.pause(20);// 更新數(shù)據(jù)if(isAnimated)for(Circle circle : circles)circle.move(0, 0, frame.getCanvasWidth(), frame.getCanvasHeight());}}private class AlgoKeyListener extends KeyAdapter{@Overridepublic void keyReleased(KeyEvent event){if(event.getKeyChar() == ' ')isAnimated = !isAnimated;}}private class AlgoMouseListener extends MouseAdapter{@Overridepublic void mousePressed(MouseEvent event){//鼠標(biāo)點(diǎn)擊坐標(biāo)減去窗口標(biāo)題欄高度event.translatePoint(0,-(frame.getBounds().height - frame.getCanvasHeight()));for(Circle circle : circles)//判斷鼠標(biāo)點(diǎn)擊是否在圓內(nèi)if(circle.contain(event.getPoint()))circle.isFilled = !circle.isFilled;}}public static void main(String[] args) {int sceneWidth = 800;int sceneHeight = 800;int N = 10;AlgoVisualizer visualizer = new AlgoVisualizer(sceneWidth, sceneHeight, N);} }

“`

效果圖片

總結(jié)

以上是生活随笔為你收集整理的java实现简单泡泡屏保动画及点击变实心泡泡的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。