java实现简单泡泡屏保动画及点击变实心泡泡
生活随笔
收集整理的這篇文章主要介紹了
java实现简单泡泡屏保动画及点击变实心泡泡
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
工具類
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)//判斷是畫空心圓還是實心圓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);}} }圓實體類及邊緣碰撞邏輯處理
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)控鍵盤事件frame.addKeyListener(new AlgoKeyListener());//監(jiān)控鼠標(biāo)事件frame.addMouseListener(new AlgoMouseListener());new Thread(() -> {run();}).start();});}// 動畫邏輯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)點擊坐標(biāo)減去窗口標(biāo)題欄高度event.translatePoint(0,-(frame.getBounds().height - frame.getCanvasHeight()));for(Circle circle : circles)//判斷鼠標(biāo)點擊是否在圓內(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实现简单泡泡屏保动画及点击变实心泡泡的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: html5背景泡泡,HTML5 canv
- 下一篇: POJ 1008 玛雅日历