AWT和Swing显示GIF 动画

开发 后端
本文介绍AWT和Swing组件可以直接通过 Graphics.drawImage() 来显示 GIF 动画, 但是一直不太做界面程序。

很早就知道AWT和Swing组件可以直接通过 Graphics.drawImage() 来显示 GIF 动画, 但是一直不太做界面程序, 也就没有仔细用过.

现在做 WoW Traverser, 因为修改是异步提交到服务器, 所以有必要对正在提交的更改进行界面提示, 打算做个黄色alpha混和的渐变闪动效果来实现, 于是第一反应是做一个透明度不断变化的纯黄色GIF, 画到界面上去.

但是用GIMP总是做出来效果不对, 于是想干脆自己写程序实现, 反正就是加个黄色的混和, 利用AWT和Swing显示GIF相同的机制, 效率和稳定性应该也不会差. 最后花了一天时间研究AWT和Swing的动画机制.

虽然也了解了一些原本不知道的细节, 但是结果还是让我很失望, 原来drawImage时就是把当前Component注册为该图片的ImageObserver, 这样GIF的下一帧到了需要显示的时间时, 通过 imageUpdated() 通知这个组件, 最终是在 java.awt.Component.imageUpdated() 中处理这个问题. 令人非常失望的是, Java都到了1.5了, AWT中这个地方的处理还是那么蹩脚, 它只是检查了一下更新频率有没有超过系统规定的上限, 只要没超过, 那么它就对Component发一个完全的repaint()请求, 甚至都没有去计算该图片的覆盖区域, 设置一个Clip区域以减少不必要的绘图操作.

更甚者, 即使之后你不再显示这个GIF了, AWT也不会自动从这个『曾经』显示的图片的ImageObserver列表中去掉这个Component, 最终导致的结果, 就是即使不再显示那个GIF, 这个Component还是会以那个GIF的刷新频率不断的毫无必要的去repaint() !! 这不但蹩脚, 简直都有点龌龊.

而且费了半天劲, 连手工去取消ImageObserver的接口都没有找到, 也就是说: 如果不是永久性的显示一个GIF, 千万不要通过java.awt.Toolkit.createImage() 构造 GIF 的 java.awt.Image对象然后往你自己的Component上画, 否则这个GIF图片将长时间占用内存以及 ImageFetcher 线程的CPU资源, 同时耗费CPU时间和GUI资源用来丝毫没有必要的反复repaint你的Component.

【编辑推荐】

  1. 在表格中Swing增加列表框
  2. 浅谈Swing控件JList
  3. 概述Swing组件与外部线程
  4. Java Swing做什么好
  5. Swing文件选择器的制作
责任编辑:佚名 来源: 电子工业出版社
相关推荐

2009-07-14 15:01:02

AWT和Swing

2009-07-10 17:20:38

Swing构件AWT构件

2009-07-17 11:13:46

AWT和SwingSwing组件

2009-07-15 16:39:51

AWT和Swing

2009-07-16 13:37:33

Swing和AWT

2009-07-10 17:03:17

AWT组件Swing组件

2009-07-17 15:30:30

JFaceAWT和SWTSwing

2009-07-17 09:36:14

SWT和Swing的区

2009-07-17 10:11:55

AWT和Swing

2009-07-17 09:07:20

2009-07-14 12:58:49

AWT和Swing

2009-07-17 10:01:14

Swing和AWT

2009-07-10 15:41:27

Swing AWT

2009-07-14 15:12:36

SwingSWT和AWT

2009-07-17 10:25:41

AWT和SwingSWT

2009-07-17 09:55:02

事件监听器SWT和SwingAWT

2011-08-29 17:17:00

Android应用gif快手iPhone应用

2009-07-17 09:44:28

Look And Fe布局管理器SWT和Swing

2011-05-04 15:21:20

swing

2011-04-15 17:33:39

SWINGAWT
点赞
收藏

51CTO技术栈公众号