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

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

直接上效果图:

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>
  • 分享

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

    245 引用 • 1776 回帖 • 1 关注
  • Java

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

    3169 引用 • 8208 回帖

相关帖子

欢迎来到这里!

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

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

    很强势的代码

  • 其他回帖
  • Stone
    作者

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

    1 回复
  • 88250

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

  • 88250

    这个是屏保版 [1471919913151]

  • 查看全部回帖

推荐标签 标签

  • Kotlin

    Kotlin 是一种在 Java 虚拟机上运行的静态类型编程语言,由 JetBrains 设计开发并开源。Kotlin 可以编译成 Java 字节码,也可以编译成 JavaScript,方便在没有 JVM 的设备上运行。在 Google I/O 2017 中,Google 宣布 Kotlin 成为 Android 官方开发语言。

    19 引用 • 33 回帖 • 51 关注
  • GAE

    Google App Engine(GAE)是 Google 管理的数据中心中用于 WEB 应用程序的开发和托管的平台。2008 年 4 月 发布第一个测试版本。目前支持 Python、Java 和 Go 开发部署。全球已有数十万的开发者在其上开发了众多的应用。

    14 引用 • 42 回帖 • 705 关注
  • MySQL

    MySQL 是一个关系型数据库管理系统,由瑞典 MySQL AB 公司开发,目前属于 Oracle 公司。MySQL 是最流行的关系型数据库管理系统之一。

    675 引用 • 535 回帖
  • Vim

    Vim 是类 UNIX 系统文本编辑器 Vi 的加强版本,加入了更多特性来帮助编辑源代码。Vim 的部分增强功能包括文件比较(vimdiff)、语法高亮、全面的帮助系统、本地脚本(Vimscript)和便于选择的可视化模式。

    28 引用 • 66 回帖 • 7 关注
  • Rust

    Rust 是一门赋予每个人构建可靠且高效软件能力的语言。Rust 由 Mozilla 开发,最早发布于 2014 年 9 月。

    58 引用 • 22 回帖
  • 以太坊

    以太坊(Ethereum)并不是一个机构,而是一款能够在区块链上实现智能合约、开源的底层系统。以太坊是一个平台和一种编程语言 Solidity,使开发人员能够建立和发布下一代去中心化应用。 以太坊可以用来编程、分散、担保和交易任何事物:投票、域名、金融交易所、众筹、公司管理、合同和知识产权等等。

    34 引用 • 367 回帖 • 2 关注
  • Gitea

    Gitea 是一个开源社区驱动的轻量级代码托管解决方案,后端采用 Go 编写,采用 MIT 许可证。

    4 引用 • 16 回帖 • 1 关注
  • 博客

    记录并分享人生的经历。

    272 引用 • 2386 回帖
  • 负能量

    上帝为你关上了一扇门,然后就去睡觉了....努力不一定能成功,但不努力一定很轻松 (° ー °〃)

    88 引用 • 1234 回帖 • 442 关注
  • Shell

    Shell 脚本与 Windows/Dos 下的批处理相似,也就是用各类命令预先放入到一个文件中,方便一次性执行的一个程序文件,主要是方便管理员进行设置或者管理用的。但是它比 Windows 下的批处理更强大,比用其他编程程序编辑的程序效率更高,因为它使用了 Linux/Unix 下的命令。

    122 引用 • 73 回帖
  • Hadoop

    Hadoop 是由 Apache 基金会所开发的一个分布式系统基础架构。用户可以在不了解分布式底层细节的情况下,开发分布式程序。充分利用集群的威力进行高速运算和存储。

    85 引用 • 122 回帖 • 617 关注
  • AngularJS

    AngularJS 诞生于 2009 年,由 Misko Hevery 等人创建,后为 Google 所收购。是一款优秀的前端 JS 框架,已经被用于 Google 的多款产品当中。AngularJS 有着诸多特性,最为核心的是:MVC、模块化、自动化双向数据绑定、语义化标签、依赖注入等。2.0 版本后已经改名为 Angular。

    12 引用 • 50 回帖 • 442 关注
  • RabbitMQ

    RabbitMQ 是一个开源的 AMQP 实现,服务器端用 Erlang 语言编写,支持多种语言客户端,如:Python、Ruby、.NET、Java、C、PHP、ActionScript 等。用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗。

    49 引用 • 60 回帖 • 396 关注
  • SOHO

    为成为自由职业者在家办公而努力吧!

    7 引用 • 55 回帖 • 65 关注
  • 链滴

    链滴是一个记录生活的地方。

    记录生活,连接点滴

    143 引用 • 3752 回帖
  • GitLab

    GitLab 是利用 Ruby 一个开源的版本管理系统,实现一个自托管的 Git 项目仓库,可通过 Web 界面操作公开或私有项目。

    46 引用 • 72 回帖
  • 生活

    生活是指人类生存过程中的各项活动的总和,范畴较广,一般指为幸福的意义而存在。生活实际上是对人生的一种诠释。生活包括人类在社会中与自己息息相关的日常活动和心理影射。

    230 引用 • 1454 回帖
  • Flutter

    Flutter 是谷歌的移动 UI 框架,可以快速在 iOS 和 Android 上构建高质量的原生用户界面。 Flutter 可以与现有的代码一起工作,它正在被越来越多的开发者和组织使用,并且 Flutter 是完全免费、开源的。

    39 引用 • 92 回帖
  • RIP

    愿逝者安息!

    8 引用 • 92 回帖 • 322 关注
  • 国际化

    i18n(其来源是英文单词 internationalization 的首末字符 i 和 n,18 为中间的字符数)是“国际化”的简称。对程序来说,国际化是指在不修改代码的情况下,能根据不同语言及地区显示相应的界面。

    7 引用 • 26 回帖
  • 数据库

    据说 99% 的性能瓶颈都在数据库。

    333 引用 • 619 回帖
  • Java

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

    3169 引用 • 8208 回帖
  • OkHttp

    OkHttp 是一款 HTTP & HTTP/2 客户端库,专为 Android 和 Java 应用打造。

    16 引用 • 6 回帖 • 48 关注
  • FreeMarker

    FreeMarker 是一款好用且功能强大的 Java 模版引擎。

    23 引用 • 20 回帖 • 429 关注
  • 互联网

    互联网(Internet),又称网际网络,或音译因特网、英特网。互联网始于 1969 年美国的阿帕网,是网络与网络之间所串连成的庞大网络,这些网络以一组通用的协议相连,形成逻辑上的单一巨大国际网络。

    96 引用 • 330 回帖
  • Solo

    Solo 是一款小而美的开源博客系统,专为程序员设计。Solo 有着非常活跃的社区,可将文章作为帖子推送到社区,来自社区的回帖将作为博客评论进行联动(具体细节请浏览 B3log 构思 - 分布式社区网络)。

    这是一种全新的网络社区体验,让热爱记录和分享的你不再感到孤单!

    1427 引用 • 10046 回帖 • 472 关注
  • 强迫症

    强迫症(OCD)属于焦虑障碍的一种类型,是一组以强迫思维和强迫行为为主要临床表现的神经精神疾病,其特点为有意识的强迫和反强迫并存,一些毫无意义、甚至违背自己意愿的想法或冲动反反复复侵入患者的日常生活。

    15 引用 • 161 回帖