java 代码实现《黑客帝国》酷炫数字雨效果

本贴最后更新于 3228 天前,其中的信息可能已经事过境迁

直接上效果图:

1472700330637

目前的样子还可以美化,期待其他童鞋效果图 0.0
下边是代码

package cn.com.entity; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Cursor; import java.awt.Dimension; import java.awt.Font; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Image; import java.awt.Point; import java.awt.Toolkit; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import java.awt.image.MemoryImageSource; import java.util.Random; import javax.swing.JDialog; import javax.swing.JPanel; import javax.swing.Timer; public class Rain extends JDialog implements ActionListener { private static final long serialVersionUID = 1549334578038217282L; private Random random = new Random(); private Dimension screenSize; private JPanel graphicsPanel; // 行高,列宽 private final static int gap = 20; // 存放雨点顶部的位置信息(marginTop) private int[] posArr; // 行数 private int lines; // 列数 private int columns; public Rain() { initComponents(); } private void initComponents() { setLayout(new BorderLayout()); graphicsPanel = new GraphicsPanel(); add(graphicsPanel, BorderLayout.CENTER); // 设置光标不可见 Toolkit defaultToolkit = Toolkit.getDefaultToolkit(); Image image = defaultToolkit.createImage(new MemoryImageSource(0, 0, null, 0, 0)); Cursor invisibleCursor = defaultToolkit.createCustomCursor(image, new Point(0, 0), "cursor"); setCursor(invisibleCursor); // ESC键退出 KeyPressListener keyPressListener = new KeyPressListener(); this.addKeyListener(keyPressListener); // this.setAlwaysOnTop(true); // 去标题栏 this.setUndecorated(true); // 全屏 this.getGraphicsConfiguration().getDevice().setFullScreenWindow(this); this.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE); setVisible(true); screenSize = Toolkit.getDefaultToolkit().getScreenSize(); lines = screenSize.height / gap; columns = screenSize.width / gap; posArr = new int[columns + 1]; random = new Random(); for (int i = 0; i < posArr.length; i++) { posArr[i] = random.nextInt(lines); } // 每秒10帧 new Timer(100, this).start(); } /** * @return 随机字符 */ private char getChr() { return (char) (random.nextInt(94) + 33); } @Override public void actionPerformed(ActionEvent e) { graphicsPanel.repaint(); } private class GraphicsPanel extends JPanel { private static final long serialVersionUID = 3043939524168375053L; @Override public void paint(Graphics g) { Graphics2D g2d = (Graphics2D) g; g2d.setFont(getFont().deriveFont(Font.BOLD)); g2d.setColor(Color.BLACK); g2d.fillRect(0, 0, screenSize.width, screenSize.height); // 当前列 int currentColumn = 0; for (int x = 0; x < screenSize.width; x += gap) { int endPos = posArr[currentColumn]; g2d.setColor(Color.CYAN); g2d.drawString(String.valueOf(getChr()), x, endPos * gap); int cg = 0; for (int j = endPos - 15; j < endPos; j++) { // 颜色渐变 cg += 20; if (cg > 255) { cg = 255; } g2d.setColor(new Color(0, cg, 0)); g2d.drawString(String.valueOf(getChr()), x, j * gap); } // 每放完一帧,当前列上雨点的位置随机下移1~5行 posArr[currentColumn] += random.nextInt(5); // 当雨点位置超过屏幕高度时,重新产生一个随机位置 if (posArr[currentColumn] * gap > getHeight()) { posArr[currentColumn] = random.nextInt(lines); } currentColumn++; } } } private class KeyPressListener extends KeyAdapter { @Override public void keyPressed(KeyEvent e) { if (e.getKeyCode() == KeyEvent.VK_ESCAPE) { System.exit(0); } } } public static void main(String[] args) { new Rain(); } }

这是 html 版的

<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title></title> <style type="text/css"> canvas { display: block; } </style> </head> <body> <canvas id="canvas"></canvas> <script> function $(id) { return document.getElementById(id); } //画布 的大小设置 var mywindow = window.screen; var canvas = $("canvas"); canvas.width = mywindow.width; canvas.height = mywindow.height; //要输出的信息 var str = "0123456789"; str = str.split(""); var fontSize = 16;//输出字体的大小 //每列显示多少个信息 var cols = canvas.width / fontSize; //数组,统计下落的位置 var drops = []; for (var i = 0; i < cols; i++) { drops[i] = 1; } var ctx = canvas.getContext("2d"); function draw() { /** *这的黑客帝国: * 获取页面的 大小 包括宽度和高度 * 用cols获取能够宽度加载列数 * drops加载每一列的位置 * drops[2]=10 2为第二排的 top为10 */ ctx.fillStyle = "rgba(0,0,0,0.05)"; ctx.fillRect(0, 0, canvas.width, canvas.height); ctx.fillStyle = "green"; ctx.font = fontSize + "px arial"; for (var i = 0; i < cols; i++) { var text = str[Math.floor(Math.random() * (str.length))]; // console.info("x-"+i*fontSize); // console.info("y-"+drops[i]*fontSize); ctx.fillText(text, i * fontSize, drops[i] * fontSize); if (drops[i] * fontSize > canvas.height || Math.random() > 0.95) drops[i] = 0;//把位置恢复到最上面 //控制下落的位置 drops[i]++; } } setInterval(draw, 33); </script> </body> </html>
  • 分享

    有什么新发现就分享给大家吧!

    248 引用 • 1794 回帖
  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3201 引用 • 8217 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
  • relyn

    改成 JS 版吧,哈哈

  • 88250

    这个是屏保版 [1471919913151]

  • Stone
    作者

    @88250 我看过这个,因为不是全屏的不是全屏的

  • 88250

    贴代码的时候用 Markdown GFM 语法吧

  • Stone
    作者

    @88250 不知道怎么搞,刚才发 html 竟然没出来

    1 回复
  • 88250

    用 ``` 把代码块包起来就行

  • ZephyrJung 1 2 赞同

    酷,最喜欢这种代码可直接运行的东西 👍

  • Stone
    作者

    以前从来没写过博客,格式的东西一窍不通,刚才看了一下你说的 Markdown GFM 语法 需要加一些标签才能实现 0.0

    1 回复
  • 88250

    我帮你更新了一下,你点编辑看下内容就知道怎么高亮代码了,注意 ``` 。

  • Stone
    作者

    @88250 感谢 D 大 嘿嘿

    1 回复
  • 88250 1

    请点感谢,哈哈

  • Stone
    作者

    @88250 卧槽(二声:表示疑问)还有这功能!!

    1 回复
  • 88250

    有很多功能的啦,慢慢探索一下 😍

  • junze

    用 jS 就 OK

  • wstv 1

    很强势的代码

  • newsky001 1

    这个试了一下,很强势

  • ZephyrJung 1 赞同

    楼主你好,我将这段代码放到了 github 上,请知悉 🙏
    如觉不妥,我将立刻删除
    https://github.com/ZephyrJung/html5

请输入回帖内容 ...

推荐标签 标签

  • iOS

    iOS 是由苹果公司开发的移动操作系统,最早于 2007 年 1 月 9 日的 Macworld 大会上公布这个系统,最初是设计给 iPhone 使用的,后来陆续套用到 iPod touch、iPad 以及 Apple TV 等产品上。iOS 与苹果的 Mac OS X 操作系统一样,属于类 Unix 的商业操作系统。

    89 引用 • 150 回帖 • 1 关注
  • 持续集成

    持续集成(Continuous Integration)是一种软件开发实践,即团队开发成员经常集成他们的工作,通过每个成员每天至少集成一次,也就意味着每天可能会发生多次集成。每次集成都通过自动化的构建(包括编译,发布,自动化测试)来验证,从而尽早地发现集成错误。

    15 引用 • 7 回帖
  • Postman

    Postman 是一款简单好用的 HTTP API 调试工具。

    4 引用 • 3 回帖 • 1 关注
  • 微服务

    微服务架构是一种架构模式,它提倡将单一应用划分成一组小的服务。服务之间互相协调,互相配合,为用户提供最终价值。每个服务运行在独立的进程中。服务于服务之间才用轻量级的通信机制互相沟通。每个服务都围绕着具体业务构建,能够被独立的部署。

    96 引用 • 155 回帖
  • 印象笔记
    3 引用 • 16 回帖
  • LeetCode

    LeetCode(力扣)是一个全球极客挚爱的高质量技术成长平台,想要学习和提升专业能力从这里开始,充足技术干货等你来啃,轻松拿下 Dream Offer!

    209 引用 • 72 回帖
  • Windows

    Microsoft Windows 是美国微软公司研发的一套操作系统,它问世于 1985 年,起初仅仅是 Microsoft-DOS 模拟环境,后续的系统版本由于微软不断的更新升级,不但易用,也慢慢的成为家家户户人们最喜爱的操作系统。

    229 引用 • 476 回帖
  • CSDN

    CSDN (Chinese Software Developer Network) 创立于 1999 年,是中国的 IT 社区和服务平台,为中国的软件开发者和 IT 从业者提供知识传播、职业发展、软件开发等全生命周期服务,满足他们在职业发展中学习及共享知识和信息、建立职业发展社交圈、通过软件开发实现技术商业化等刚性需求。

    14 引用 • 155 回帖
  • 书籍

    宋真宗赵恒曾经说过:“书中自有黄金屋,书中自有颜如玉。”

    82 引用 • 412 回帖
  • 知乎

    知乎是网络问答社区,连接各行各业的用户。用户分享着彼此的知识、经验和见解,为中文互联网源源不断地提供多种多样的信息。

    10 引用 • 66 回帖
  • 锤子科技

    锤子科技(Smartisan)成立于 2012 年 5 月,是一家制造移动互联网终端设备的公司,公司的使命是用完美主义的工匠精神,打造用户体验一流的数码消费类产品(智能手机为主),改善人们的生活质量。

    4 引用 • 31 回帖 • 4 关注
  • HHKB

    HHKB 是富士通的 Happy Hacking 系列电容键盘。电容键盘即无接点静电电容式键盘(Capacitive Keyboard)。

    5 引用 • 74 回帖 • 519 关注
  • CAP

    CAP 指的是在一个分布式系统中, Consistency(一致性)、 Availability(可用性)、Partition tolerance(分区容错性),三者不可兼得。

    12 引用 • 5 回帖 • 633 关注
  • InfluxDB

    InfluxDB 是一个开源的没有外部依赖的时间序列数据库。适用于记录度量,事件及实时分析。

    2 引用 • 102 关注
  • TensorFlow

    TensorFlow 是一个采用数据流图(data flow graphs),用于数值计算的开源软件库。节点(Nodes)在图中表示数学操作,图中的线(edges)则表示在节点间相互联系的多维数据数组,即张量(tensor)。

    20 引用 • 19 回帖 • 4 关注
  • Sym

    Sym 是一款用 Java 实现的现代化社区(论坛/BBS/社交网络/博客)系统平台。

    下一代的社区系统,为未来而构建

    524 引用 • 4601 回帖 • 709 关注
  • Swift

    Swift 是苹果于 2014 年 WWDC(苹果开发者大会)发布的开发语言,可与 Objective-C 共同运行于 Mac OS 和 iOS 平台,用于搭建基于苹果平台的应用程序。

    34 引用 • 37 回帖 • 558 关注
  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3201 引用 • 8217 回帖
  • Follow
    4 引用 • 12 回帖 • 1 关注
  • Spark

    Spark 是 UC Berkeley AMP lab 所开源的类 Hadoop MapReduce 的通用并行框架。Spark 拥有 Hadoop MapReduce 所具有的优点;但不同于 MapReduce 的是 Job 中间输出结果可以保存在内存中,从而不再需要读写 HDFS,因此 Spark 能更好地适用于数据挖掘与机器学习等需要迭代的 MapReduce 的算法。

    74 引用 • 46 回帖 • 565 关注
  • SQLServer

    SQL Server 是由 [微软] 开发和推广的关系数据库管理系统(DBMS),它最初是由 微软、Sybase 和 Ashton-Tate 三家公司共同开发的,并于 1988 年推出了第一个 OS/2 版本。

    21 引用 • 31 回帖
  • BND

    BND(Baidu Netdisk Downloader)是一款图形界面的百度网盘不限速下载器,支持 Windows、Linux 和 Mac,详细介绍请看这里

    107 引用 • 1281 回帖 • 34 关注
  • 链书

    链书(Chainbook)是 B3log 开源社区提供的区块链纸质书交易平台,通过 B3T 实现共享激励与价值链。可将你的闲置书籍上架到链书,我们共同构建这个全新的交易平台,让闲置书籍继续发挥它的价值。

    链书社

    链书目前已经下线,也许以后还有计划重制上线。

    14 引用 • 257 回帖 • 1 关注
  • MongoDB

    MongoDB(来自于英文单词“Humongous”,中文含义为“庞大”)是一个基于分布式文件存储的数据库,由 C++ 语言编写。旨在为应用提供可扩展的高性能数据存储解决方案。MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。它支持的数据结构非常松散,是类似 JSON 的 BSON 格式,因此可以存储比较复杂的数据类型。

    91 引用 • 59 回帖
  • Laravel

    Laravel 是一套简洁、优雅的 PHP Web 开发框架。它采用 MVC 设计,是一款崇尚开发效率的全栈框架。

    19 引用 • 23 回帖 • 738 关注
  • JSON

    JSON (JavaScript Object Notation)是一种轻量级的数据交换格式。易于人类阅读和编写。同时也易于机器解析和生成。

    53 引用 • 190 回帖
  • 倾城之链
    23 引用 • 66 回帖 • 165 关注