【老白学 Java】简单位移动画

简单位移动画

文章来源:《Head First Java》修炼感悟。

上一篇文章中,老白利用内部类的特性完成了多个事件的处理,感觉还不错。 为了更深入理解内部类,本篇文章继续使用内部类创建一个画板,完成简单的位移动画,感兴趣的小伙伴可以继续往下看。

怎样实现位移动画

把一个图案从一个位置移动到另一个位置,我们看到的移动过程称为位移动画。 实现位移动画很简单,你可以这样考虑:

  1. 在起始位置绘制图案;
  2. 改变绘制坐标重新绘制这个图案;
  3. 以一个合适的频率不断重复上述操作,直到绘制到终点。

这里有几个关键点需要注意:

  • 如何更新绘制位置;
  • 如何调用绘制方法;
  • 如何使用内部类充当画板。

下面我们通过一个例子来演示生成位移动画的过程。

程序代码

为简单起见,例子中仅绘制了一个简单的椭圆形图案,当然你也可以绘制一张图片,效果会更好。

以下是完整代码:

java 复制代码
import javax.swing.*;
import java.awt.*;
/**
 * 文件:SimpleAnimation.java
 * 描述:利用内部类实现画板功能,完成一个简单的位移动画。
 */
public class SimpleAnimation {
	private int x = 50;			// 绘制坐标x
	private int y = 50;			// 绘制坐标y
	private DrawPanel panel;	// 自定义画板
	
	public static void main(String[] args) {
		new SimpleAnimation().go();
	}
	
	public void go() {
		JFrame frame = new JFrame();
		panel = new DrawPanel();

		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.getContentPane().add(panel);
		frame.setSize(300, 300);
		frame.setVisible(true);

		draw();	// 绘制方法
	}
	// 绘制方法
	private void draw() {
		for (int i = 0; i < 130; i++) {
			x++;
			y++;
			
			panel.repaint();	// 重绘,由系统调用绘制方法
			
			try {
				Thread.sleep(50);	// 刻意让线程休息 50ms
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}
	// 自定义的画板
	class DrawPanel extends JPanel {
		public void paintComponent(Graphics g) {
			g.setColor(Color.GREEN);
			g.fillOval(x, y, 40, 40);
		}
	}
}

需要注意,每次绘制结束后都要清屏,即便是内容没有变化也要这样做。所谓「清屏」就是指把过期画面清除,然后再重新绘制新内容,不然会出现类似「拖尾」的诡异画面,就像这样:

清屏很简单,只要使用背景颜色重新填充整个画面就可以了,就像这样:

java 复制代码
// 绘制方法
public void paintComponent(Graphics g) {
	// 清屏,使用白色填充整个背景
	g.setColor(Color.WHITE);
	g.fillRect(0, 0, this.getWidth(), this.getHeight());
	// 填充图案
	g.setColor(Color.GREEN);
	g.fillOval(x, y, 40, 40);
}

再来看看效果:

看起来还不错。

其实动画原理很简单,比如游戏中的角色行走动画,实际上就是不断绘制一组序列图片再加上位移动画,看起来就像是在不断行走。

内容预告

前面添加组件的方式多少有些投机取巧的成分,下一篇文章老白会为你详细解读 GUI 组件的布局管理器。


《 上一篇 处理多发事件
相关推荐
葡萄成熟时 !7 小时前
JAVA 常用API学习笔记
java·笔记·学习
剩下了什么8 小时前
float32 与 float64 精度陷阱:如何在 Go 中避免错误使用
开发语言·后端·golang
Rain的Java大神之路8 小时前
介绍一下分布式事务
java·分布式·后端·spring·spring cloud·架构·springcloud
指尖时光.8 小时前
Three.js 超全入门综合案例
开发语言·javascript·ecmascript
暴力求解9 小时前
Linux网络---传输层协议TCP(二)
linux·服务器·开发语言·网络·tcp/ip
吴声子夜歌9 小时前
Java面试题——基础(一)
java·开发语言
小庞在加油9 小时前
WinDbg实战:QT/跨平台项目死锁与无响应问题排查指南
开发语言·qt·windbg·工具
南城以南溫暖如初1479 小时前
外卖CPS实战指南:从技术选型到运营落地全流程解析
java·spring boot·mysql·架构·vue
Vae_Mars10 小时前
C#中的delegate委托
开发语言·c#
傻啦嘿哟10 小时前
英雄联盟皮肤爬虫:爬取全皮肤价格与特效,做比价工具
java·c++·爬虫