工具类

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){//设置标题super(title);//设置窗口宽度this.canvasWidth = canvasWidth;//设置窗口高度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){// 初始化数据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);//监控键盘事件frame.addKeyListener(new AlgoKeyListener());//监控鼠标事件frame.addMouseListener(new AlgoMouseListener());new Thread(() -> {run();}).start();});}// 动画逻辑private void run(){while(true){// 绘制数据frame.render(circles);AlgoVisHelper.pause(20);// 更新数据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){//鼠标点击坐标减去窗口标题栏高度event.translatePoint(0,-(frame.getBounds().height - frame.getCanvasHeight()));for(Circle circle : circles)//判断鼠标点击是否在圆内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);}
}

“`

效果图片

java实现简单泡泡屏保动画及点击变实心泡泡相关推荐

  1. 【JavaGUI demo】swing仿Windows气泡屏保动画(含源码)

    概述 java实现简单泡泡屏保动画及点击变实心泡泡,空格暂停动画 实现思路 采用MVC(Model-View-Controller(模型-视图-控制器))设计思路.将数据层与视图层与控制层分开. 在本 ...

  2. android屏保动画下载,防手机被偷看专用屏保

    防手机被偷看专用屏保是最近抖音上非常火的一个动态屏保,对于偷看手机的人来说是一次恶搞,上面的小人贱萌贱萌的. 软件介绍 动态壁纸,手机桌面主题美化必备神器. 拥有动态锁屏.视频壁纸.透明主题.3D壁纸 ...

  3. vue点击网页全屏_vue中实现点击变成全屏的多种方法

    项目中有点击按钮实现全屏功能 方式一:js实现全屏 全屏 data: data() { return { fullscreen: false }; }, methods: screen() { let ...

  4. android可以有一个悬浮窗口在进入屏保状态显示,点击进入应用,Android如何实现锁屏状态下弹窗...

    前言 想在锁屏上面实现弹窗,第一个想法就是利用 WindowManager设置 Window的 Flag,通过设置 Flag的显示优先级来让窗口显示在锁屏的上面. 接下来就是试验可能相关的 Windo ...

  5. T5L串口屏界面开机动画、动态屏保的设置原来如此简单

    T5L_DGUS屏封装了DGUS图片动画控件功能,支持开机自动播放动画,常应用于终端Logo的动态展示:支持动态屏保功能,可设置定时长无触控进入屏保,也可触摸进入屏保或退出屏保,常应用于终端炫酷显示的 ...

  6. Java彩球屏保的制作

    一.首先建立包ball,然后创建模板类BallModel BallModel类代码如下 : package ball;import java.awt.Color; import java.awt.Gr ...

  7. 简单的WIN32屏保开发制作(可播放视频)

    本文不同于VC下使用ScrnSave.lib进行屏保制作的方式, 而是在VS下以其内在原理,从无到有进行一个简单的WIN32屏保开发, 只要你拥有一些简单的WIN32程序编写的经验,便可以很轻松的明白 ...

  8. dreambackend.java_【AndroidTV】如何自定义屏保、更改屏保时长

    目录 目录 系统屏保源码有哪些 在设置中显示的屏保选项有哪些 屏保选项是如何获得的 多久出现屏保 修改方法 我的应用 项目需求 处理方式 遇到一个诡异的问题 系统屏保源码有哪些 如果要自定义屏保可以参 ...

  9. 电脑所有程序里有不一样颜色_12个好玩的电脑屏保,让你成为别人眼中最靓的仔。...

    Hello 大家好,这里是工具狂人.作为一个靠打字(哦不,搬砖)为生的新媒体小编,每天多数时候都是对着电脑屏幕,中途有时会拿起手机回复消息.查看短信.刷起微博.刷手机的时间一长,眼前的电脑会自动打开系 ...

  10. 自定义设置一个屏保程序

    用C语言写一个简单的窗口程序,目的是生成一个可视化的图形窗口,需要用到EasyX库,可在文章末尾的网盘链接中下载.该程序退出需左击鼠标,否则无法退出. #include<stdio.h> ...

最新文章

  1. 分布式技术追踪 2017年第十五期
  2. python3高级语法:__slots__属性、property装饰器、上下文管理协议、__new__方法
  3. CSS3属性之多栏布局column
  4. 46.一个例子了解C++中异常处理
  5. Django-发送注册、忘记密码邮件验证-send_mail
  6. 微服务升级_SpringCloud Alibaba工作笔记0007---spring gateway搭建
  7. 安装nagios中php安装报错 configure error xml2-config not foud
  8. ios 企业证书 ipa 重新签名发布
  9. HDU3595_GG and MM
  10. 老年人健康管理系统技术开发
  11. vm虚拟机怎么连接wifi_win7下安装的vmware虚拟机怎么接入无线局域网实现网络互联互通-网络教程与技术 -亦是美网络...
  12. Office基础操作:Word、PPT 表格文字居中
  13. 二元函数可导与可微的关系_如何理解多元函数可微与可偏导的关系?
  14. 区块链和AI的比武,谁将登上黑科技这一宝座
  15. java itext5 插入一个艺术文字 (剪切蒙版)
  16. V831基础-UART
  17. Docker容器启动报WARNINGIPv4 forwarding
  18. 测试手机运行速度的软件,你的手机合格了吗 两款手机性能测试软件横评
  19. 程鑫峰:1.19伦敦金陷多空交织,长江金业后市行情解析
  20. Gn 与 Ninja学习和使用

热门文章

  1. nas主流服务器,NAS以及服务器
  2. 测试晶面间距软件_i-TEM软件测量TEM高分辨像晶面间距.PDF
  3. 编译--把高级语言变成低级语言
  4. 软考高级信息系统项目管理师好考吗?
  5. 如何量化考核软件开发人员绩效
  6. php edm 系统,edm.php · 那些年我们一起/fanwe - Gitee.com
  7. Desktops 虚拟桌面软件(推荐)
  8. 单位载质量能量消耗量_Ekg指标计算案例之电动物流车
  9. android bugly qq,Android如何快速集成腾讯Bugly
  10. 数值分析龙贝格matlab,MATLAB数值分析实验二(复合梯形、辛普森和龙贝格求积,以及二重积分计算等)...