AWT和Swing显示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文件选择器的制作

本文标题:AWT和Swing显示GIF 动画
文章出自:http://www.mswzjz.cn/qtweb/news37/112337.html

攀枝花网站建设、攀枝花网站运维推广公司-贝锐智能,是专注品牌与效果的网络营销公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 贝锐智能