史上最扯Java图形绘制(J2SE)之一JAVA动画效果
其实Java这东西吧,就简便性和其初衷而言,真他妈就在GUI 这地界是有优势的,单就其2D界面开发的易用性来说,借用《地下交通站》里黑瞎子——黑藤太君骂贾队长的话来说“全中国,不,全东亚,还能找出你这样空前 绝后的脸吗?”。所以它不普及,无外两点,1.搞Java的多半不指着这东西混饭吃,比如兄弟目前还被逼用 SSH(Struts+Spring+Hibernate)混饭吃。2.效率低,为了改变本来AWT的可移植性而开发Swing,结果搞得层次过多,效率 低下,反倒是走回AWT老路的SWT比较吃香,害得SUN从1.6开始又给AWT扩充新类,谁让Swing玩底层要靠AWT的……
兄弟不才,大家也碰上个愣主,我就准备以闲扯的方式鼓捣鼓捣这爹不亲娘不爱的玩意。
既然提到UI,那怎么也得有图像吧?图像,再次也得弄张图来操作吧?所以咱爷们就先从Java图像的加载入手,操练起来~
package org.test;
import java.awt.Canvas;
import java.awt.Color;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Toolkit;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.net.URL;
/**
* <p>
* Title: 史上最扯Java图形绘制(J2SE)教程之一,图像变换。
* </p>
* <p>
* Description:图像变换
* </p>
* <p>
* Copyright: Copyright (c) 2007
* </p>
*
* @author chenpeng
* @email:[email]ceponline@yahoo.com.cn[/email]
* @version 0.1
*/
public class SimpleAnime extends Frame {
/**
* 这个例子我用AWT来讲解,实际上,我们都知道使用Swing时,对图 像绘制上有很多的优化,但是在AWT中,这些都是要我们手动来做得,
* 所以入门我还是以AWT开始。(其实大家都知道,组件名加个J就变 Swing了……几乎不用改别的。)
*/
private static final long serialVersionUID = 1L;
// 用于存储图片
Image act;
// 俗称的帆布啦,做手机开发的话很常见
Canvas canvas = new Canvas() {
private static final long serialVersionUID = 1L;
/**
* 绘制图像,直接调用update方法(顺便说一下,若以paint调用update,
* 再用update调用paint,会出现很好玩的事。^^)
*/
public void paint(Graphics g) {
update(g);
}
/**
* 此方法仅在在发生变更时绘制图形
*/
public void update(Graphics g) {
// 参数分别为加载图像,所在Graphics上的left,所在top,图像width,图像height,目标对象
g.drawImage(act, getWidth() / 2 - act.getWidth(null) / 2,
getHeight() / 2 - act.getHeight(null) / 2, act
.getWidth(null), act.getHeight(null), this);
}
};
/**
* 简单动画的构造
*
*/
public SimpleAnime() {
setTitle("图像变换");
setSize(400, 400);
// 设定背景为黑色
setBackground(Color.BLACK);
// 直接以class路径读取图片资源
URL imageUrl = getClass().getResource("/image/act.jpg");
// 获取image图像实体
act = Toolkit.getDefaultToolkit().createImage(imageUrl);
// 加载帆布作为背景
add(canvas);
class AnimeMouseListener extends MouseAdapter {
// 鼠标进入变更
public void mouseEntered(MouseEvent e) {
// 顺便说一下,水平反转图的效果,是可以用代码做到的,后面讲解。
URL imageUrl = getClass().getResource("/image/act0.jpg");
act = Toolkit.getDefaultToolkit().createImage(imageUrl);
canvas.repaint();
}
// 鼠标离开变更
public void mouseExited(MouseEvent e) {
URL imageUrl = getClass().getResource("/image/act.jpg");
act = Toolkit.getDefaultToolkit().createImage(imageUrl);
canvas.repaint();
}
}
//在帆布上添加鼠标监听
canvas.addMouseListener(new AnimeMouseListener());
}
/**
* 主函数
*
* @param args
*/
public static void main(String[] args) {
// 实例化本类
SimpleAnime sa = new SimpleAnime();
// 显示窗体
sa.setVisible(true);
}
}
(鼠标移入)
(鼠标在外)
这他妈才几个字母,抛除我那些狗屁都未必同通得了的注释,不到俩半字,这日本的花姑娘(正经说一句,这是月姬的同人图……)就给小爷跳上舞了,那位缺德主要加个死循环的线程进去,嘿,不赶上停电死机的,还就真格停不下来了。
闲得无聊,丧心病狂的我给加上个线程。
package org.test;
import java.awt.Canvas;
import java.awt.Color;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Toolkit;
import java.net.URL;
/**
* @author chenpeng
* @email:[email]ceponline@yahoo.com.cn[/email]
* @version 0.1
*/
public class SimpleAnime0 extends Frame {
private static final long serialVersionUID = 1L;
Image act1;
Image act2;
// 是否令图像移动
boolean actMoving = false;
// 初始图像编号
int actPhase = 1;
Canvas c = new Canvas() {
private static final long serialVersionUID = 1L;
/**
* 绘制图像,直接调用update方法(顺便说一下,若以paint调用update, 再用update调用paint,会出现很好玩的事。^^)
*/
public void paint(Graphics g) {
update(g);
}
/**
* 此方法仅在在发生变更时绘制图形
*/
public void update(Graphics g) {
if (actMoving) {
if (actPhase == 1) {
g
.drawImage(act1, getWidth() / 2
- act1.getWidth(null) / 2, getHeight() / 2
- act1.getHeight(null) / 2, act1
.getWidth(null), act1.getHeight(null), this);
} else {
g
.drawImage(act2, getWidth() / 2
- act2.getWidth(null) / 2, getHeight() / 2
- act2.getHeight(null) / 2, act2
.getWidth(null), act2.getHeight(null), this);
}
}
}
};
/**
* 简单动画的构造
*
*/
public SimpleAnime0(boolean isRun) {
actMoving = isRun;
setTitle("图像变换");
setSize(400, 400);
// 设定背景为黑色
setBackground(Color.BLACK);
//这只是一个图像加载的演示,我们完全可以定义一个Image数组,然后动态加载
//做成动画播放。
URL imageUrl = getClass().getResource("/image/act.jpg");
act1 = Toolkit.getDefaultToolkit().createImage(imageUrl);
imageUrl = getClass().getResource("/image/act0.jpg");
act2 = Toolkit.getDefaultToolkit().createImage(imageUrl);
add(c);
/**
* 顺便介绍一下,在Swing下有Timer类,可以设定运算周期循环触发事件。 大体写法如下,不过很多人还是愿意用线程……
*
* class TimerListener implements ActionListener{ public void
* actionPerformed(ActionEvent e){ if(!actMoving) return; actPhase =
* (actPhase == 1) ? 2 : 1; canvas.repaint(); } } javax.swing.Timer t =
* new javax.swing.Timer(200,new TimerListener()); t.start();
*/
Thread t = new Thread(new Timer());
t.start();
}
/**
* 事件循环处理线程
*
* @author chenpeng
*/
class Timer implements Runnable {
public void run() {
while (true) {
if (!actMoving)
return;
actPhase = (actPhase == 1) ? 2 : 1;
c.repaint();
try {
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
/**
* 主函数
*
* @param args
*/
public static void main(String[] args) {
// 实例化本类,并触发循环事件
SimpleAnime0 sa = new SimpleAnime0(true);
// 显示窗体
sa.setVisible(true);
}
}
本文转自 cping 51CTO博客,原文链接:http://blog.51cto.com/cping1982/130224
史上最扯Java图形绘制(J2SE)之一JAVA动画效果相关推荐
- css3绘制八卦图及动画效果
原理很简单,就是外面加个盒子box.作为旋转动画的box,然后里面分别利用两个div使用css3的 border-radius绘制半圆,分别定位在上下中间对齐两个位置,里面在放两个小的原点水平和垂直方 ...
- “史上最全”Spring Boot详解!java程序员细节到极致的一次,魔鬼
这本书的灵感 当时公司的技术栈全面转入Spring Boot体系,源于本书作者在公司的一次分享会上的分享.当时作者用了不到10分钟就使用Spring Boot轻松制作了一个功能完整的数据增加.删除.修 ...
- java图形界面制作表格,Java自学-图形界面 表格
Swing 使用 JTable详解 示例 1 : 基本表格 显示一个Table需要两组数据 一维数组: String[]columnNames 表示表格的标题 二维数组: String[][] her ...
- java动态图片_java实现gif动画效果(java显示动态图片)
关闭 关闭 java实现gif动画效果(java显示动态图片) 作者: 字体:[增加 减小] 类型:转载 时间:2014-04-29我要评论 这篇文章主要介绍了java实现gif动画效果示例(java ...
- java 图形绘制_Java Graphics 图形绘制
Graphics类提供基本绘图方法,Graphics类提供基本的几何图形绘制方法,主要有:画线段.画矩形.画圆.画带颜色的图形.画椭圆.画圆弧.画多边形.画字符串等. 画线段 drawLine pub ...
- 仿掌上英雄联盟能力值图形绘制
一,前沿 相信玩撸啊撸的撸友们一定记得掌上英雄联盟App的能力值吧~~ 好吧,不记得没关系我来给大家上张图! ! 所以今天呢我就抽出时间模仿了一下: 照例线来张GIF,有图有真相 以下是我的微博账号希 ...
- 【史上最强实战项目合集】java项目20套 +完整版java学习视频
如果你是初学者,或者是自学者!你可以加小编微信(2782278837)!小编可以给你一些好的建议以及给你(免费)提供学习资料!你在学习上有什么问题都可以咨询小编!小编都会为你解答! 注:本公众号纯属个 ...
- 史上最全 JVM 大全详解、java 程序员细节到极致的一次,魔鬼
前言 作为 Java 的从业者,在找工作的时候,一定会被问及关于 JVM 相关的知识. JVM 知识的掌握程度,在很多面试官眼里是候选人技术深度的一个重要评判标准.而大多数人可能没有对 JVM 的实际 ...
- 史上最全 JVM 大全详解!java 程序员细节到极致的一次,魔鬼
前言 作为 Java 的从业者,在找工作的时候,一定会被问及关于 JVM 相关的知识. JVM 知识的掌握程度,在很多面试官眼里是候选人技术深度的一个重要评判标准.而大多数人可能没有对 JVM 的实际 ...
最新文章
- 怎么设计计算机网络共享,如何设置网络共享 网络共享设置方法【详解】
- 26.angularJS $routeProvider
- httpclient get post
- 宜信开源|详解PaaS平台LAIN的功能和架构
- Windows 技术篇-任务管理器查看执行进程的程序所在位置方法,查看执行进程的命令行
- LinkedList集合
- shell之什么时候使用shell以及最简单的shell程序
- 无法打开物理文件 XXX.mdf,操作系统错误 5.5(拒绝访问) 的解决办法
- 【EXLIBRIS】纸版书目整理 -- 大书架 下 【64 种】【103 册】
- GARFIELD@01-01-2005
- 【iOS】UIViewController、UINavigationController与UITabBarController的整合使用
- 升级CentOS到最新版本
- 静默安装oracle11,Oracle11g静默安装
- Mac OS读写NTFS
- python编程输入名字配对情侣网名_输入名字查另一半名字,怎样用一半情侣网名查...
- 设置二级域名解析到同IP不同端口
- pwnable.kr unlink
- 多元线性方程的python解法
- unity scripting backend mono vs il2cpp
- latex自动编译 (ubuntu/win)
热门文章
- mongoose 使用总结
- 在Ubuntu虚拟机中安装VMware tools异常中断
- 怎样获得listview的第一个item?
- Sharepoint 2007 定制Feature和卸载Feature
- 共享单车哈罗王炸连出,OFO小心沦为炮灰
- Linux常用命令集合
- 关于Installshield里一些常见问题的解答—艾泽拉斯之海洋女神出品
- java+flash在线拍照和编辑,保存到服务器(Spring3.2.2+swf+jquery)
- 如何弹出UIDatePicker最好
- 比特币现金BCH 硬分叉,能否突破$1500?