[JAVA]从零开始的“桌面宠物”之路(一):动画效果
>我将要做一个什么?
也算是突发奇想,以前一直用C#写的桌面应用,但最近有点沉迷JAVA,加上最近不小心打开了阔别十来年的QQ宠物(现在QQ宠物Client已经变得都是广告了),想起了瑞星小狮子,有点怀旧,就想找找有没有简单、干净一些的桌面宠物养成游戏软件,写代码的时候趴在窗口上卖卖萌也是甚好的。
找了找,还真有。在Github上找到了一个日本人写的开源桌面宠物项目:https://github.com/nonowarn/shimeji4mac。然而不幸的是,作者似乎也很久不开发了,且这个东西是明确标明需要JRE6-32bit才能运行。在JRE9都出来了的今天,为了这么个宠物专门去寻找、并安装一个JRE6,不合适吧;况且这玩意现在也不算很好找了,哪怕是在oracle官网找JRE6的下载地址都要找不少时间。于是就手痒,想自己写一个。
我会尽量不使用除了JDK自带的jar以外的东西,并随缘更新这个系列。由于我不是很喜欢写xml,因此主要将用Swing来进行开发。
>JAVA的运行问题
刚刚提到了Shimoji桌面宠物需要JRE6才能运行的问题,那我现在用JRE,换个没有JRE环境的电脑不就不能运行了?
啊,确实是这样的,不过我们有办法规避这个问题,让你的jar伪装成一个exe,像c#写的桌面应用一样到处跑:http://blog.csdn.net/shenpibaipao/article/details/78701034
>今天的目标
今天的目标是,既然是桌面宠物,那么它一定是能动的。所以我们先从如何解决桌面宠物的动画问题解决起。
下面是完成后的效果演示:(素材取自Undertale贴吧)
>核心问题
核心问题主要有两个:
- 如何加载图片?
- 如何让图片动起来?
先说第一个问题:如何加载图片。
在Swing中,我习惯用一个JLabel去加载图片:
public JLabel loadPicture(int x,int y,String url){JLabel jLabel = new JLabel();ImageIcon icon = new ImageIcon(url);int picWidth = icon.getIconWidth(),pinHeight = icon.getIconHeight();icon.setImage(icon.getImage().getScaledInstance(picWidth,pinHeight,Image.SCALE_DEFAULT));jLabel.setBounds(x,y,picWidth,pinHeight);jLabel.setIcon(icon);return jLabel;}
上面这段代码会返回一个加载了图片的JLabel,其左上角位置相对于父容器为(x,y)。
要让它动起来,我们需要准备一条连续的图片素材:(图片素材和项目Demo代码我会放到最后供下载使用)
其次,我们专门运行一个新的线程,通过sleep的方法去更换帧。这样效率虽然不高,但我们并不是在写什么大工程,作为一个桌面宠物,足矣。
现在,我们修改刚刚加载图片的方法,把它变成一个给指定JLabel更换新图片的方法:
private void cgJLabelImg(JLabel jLabel,String imgUrl){ImageIcon icon = new ImageIcon(imgUrl);int picWidth = icon.getIconWidth(),pinHeight = icon.getIconHeight();icon.setImage(icon.getImage().getScaledInstance(picWidth,pinHeight, Image.SCALE_DEFAULT));jLabel.setBounds(0,0,picWidth,pinHeight);jLabel.setIcon(icon);}
假设上面三张素材图片的名字分别为:"a1.png"、"a2.png"、"a3.png",那么专门处理动画帧的线程就可以这么写了:
// 动画线程 这里用到了JDK8的lambda表达式new Thread(() -> {int i=1;try{while (true){Thread.sleep(250);cgJLabelImg(jLabel,"a"+ i++ +".png");if(i>3)i=1;}} catch (Exception e){e.printStackTrace();}}).start();
我在这里写了个JDK8的Lambda表达式,如果你对这种写法有兴趣,可以看看这里:http://blog.csdn.net/shenpibaipao/article/details/78622456。不过就算不想了解Lambda表达式也没关系,其相当于:
new Thread(new Runnable() {@Overridepublic void run() {int i=1;try{while (true){Thread.sleep(250);cgJLabelImg(jLabel,"a"+ i++ +".png");if(i>3)i=1;}}catch (Exception e){e.printStackTrace();}}}).start();
现在就可以去运行程序了。然后你会注意到一个问题,由于我们的素材是背景透明的png图片,但承载JLabel的JFrame的背景却是灰色的实体背景,看着就很丑。而且我们其实也不需要标题栏,那么我们可以给JFrame加上两个属性:
// 框体透明this.setUndecorated(true); // 取消窗口标题栏this.setBackground(new Color(0,0,0,0));// 背景透明
完活,今天的任务就到这里结束了。可以到下面的链接去下载具体的素材和代码自己试试。
>素材及Demo代码下载
CSDN下载:http://download.csdn.net/download/shenpibaipao/10143462
次篇:[JAVA]从零开始的“桌面宠物”之路(二):系统托盘与任务栏
[JAVA]从零开始的“桌面宠物”之路(一):动画效果相关推荐
- [JAVA]从零开始的“桌面宠物”之路(二):系统托盘与任务栏
>今天的目标 在Window系统下,打开QQ宠物,我们并不能再任务栏看到相关的窗口.这也很好理解,毕竟桌面宠物就相当于一个桌面挂件,如果这个挂件侵入到我们的工作区(任务栏),就很烦,也很影响工作 ...
- 用java写一个表白神器,要有动画效果
下面是一个简单的 Java 程序示例,它显示了一个窗口,在窗口中以动画效果显示表白话语. import java.awt.*; import javax.swing.*;public class Lo ...
- 用Python写个桌面挂件,手把手带你做只桌面宠物~
导语 前段时间有小伙伴留言说想让我带大家写写桌面小挂件,今天就满足一下留过类似言的小伙伴的请求呗~不过感觉写桌面的挂历啥的没意思,就简单带大家做一只桌面宠物吧~ 皮卡丘大家喜欢吗~今天就由做个皮卡丘为 ...
- python给女友一个小惊喜——桌面宠物【DIY版】
嗨害大家好鸭!我是小熊猫❤ 这不是小别胜新欢嘛~ 所以懂得都懂~ 这次给她准备了一些小惊喜 做为程序员,我也只会这个啦(●'◡'●) 开发工具 Python版本:3.6.4 相关模块: PyQt5模块 ...
- 利用python写个桌面挂件,带大家做只桌面宠物
转载自品略图书馆 http://www.pinlue.com/article/2020/05/2516/2110606798446.html 导语 前段时间有小伙伴留言说想让我带大家写写桌面小挂件,今 ...
- 用Python实现自制桌面宠物,变出一个桌面小挂件
前言 就喜欢自己自定义一些小玩意,今天就来分享一些制作桌面宠物的素材,还有代码 相关文件 声明:图片素材源于网络,侵歉删. 开发工具 Python版本:3.6.4 相关模块: PyQt5模块: 以及一 ...
- python桌面宠物模块_利用python写个桌面挂件 | 手把手带大家做只桌面宠物呗
导语 前段时间有小伙伴留言说想让我带大家写写桌面小挂件,今天就满足一下留过类似言的小伙伴的请求呗~不过感觉写桌面的挂历啥的没意思,就简单带大家做一只桌面宠物吧~ 废话不多说,让我们愉快地开始吧~ 开发 ...
- python桌面宠物_写个桌面挂件 | 手把手带大家做只桌面宠物呗
原文链接网页链接mp.weixin.qq.com 效果展示桌面宠物https://www.zhihu.com/video/1230197062286778368 导语 前段时间有小伙伴留言说想让我带 ...
- 桌宠必须要java吗_桌宠软件电脑版下载_桌面宠物软件免费版下载_3DM软件
<桌宠>是一款桌面宠物软件,软件能够让你根据自己的喜好设置一只宠物,然后它会放养在你的桌面上,你要像真实的宠物一样照顾它,饲养喂食,给他治病陪他玩耍,这个过程非常有趣. 软件简介 在网上下 ...
最新文章
- IO流(六)之CharArrayReader类与CharArrayWriter类
- pyflink的local模式实验记录
- java js跳出循环_[Java教程]js循环的总结
- ActiveMQ 权限
- 操作文件的实用类,删除目录,清空目录,删除文件
- MATLAB 高等数学中的应用
- 解决华为手机、平板系统没有录屏、不能分享录屏的问题
- 部分商誉确认法和全部商誉确认法
- Apache DolphinScheduler 2.X保姆级源码解析
- 小米路由固件中lua文件反编译
- Uri.parse()的各种用法
- 5000的游戏电脑计算机配置,5000元电脑配置单,5000游戏电脑配置,直播电脑配置
- JS And Vue代码调试——IDEA+JS+vue-devtools-dev+JetBrains IDE Support(Chrome插件)
- 天玑9200搭载Arm最新旗舰GPU,性能爆表!支持移动端硬件光追
- PDF如何设置注释字体大小
- 2021年京东撸货还能做吗?轻松实现利益最大化,新手必看!
- 写给程序员儿子的一封信
- OSI7层模型数据分层传输的过程
- This was likely an oversight when migrating to django.urls.path().
- 金三银四!95后阿里P7晒出工资单:狠补了这个,真香...
热门文章
- EC-PCA: 利润中心主数据维护流程
- configure: error: C++ preprocessor “/lib/cpp“ fails sanity check
- 软件开发—钱多多—典型用户分析
- AppRTC(WebRTC)服务器搭建
- 访问www.baidu.com全过程
- 12月更新 - 可能是最好用百度网盘搜索神器
- BZOJ2054疯狂的馒头
- 高通终端修改nv值后,不重启终端即生效
- 关于功放的正确调整及安全匹配音箱方法的计算及说明
- Excel 2010 SQL应用083 降序排列