当前位置:首页 > 开发 > 编程语言 > 编程 > 正文

蹩脚的AWT/SWING GIF显示

发表于: 2006-05-11   作者:歆渊   来源:转载   浏览:
摘要: 很早就知道AWT/SWING组件可以直接通过 Graphics.drawImage() 来显示 GIF 动画, 但是一直不太做界面程序, 也就没有仔细用过. 现在做 WoW Traverser, 因为修改是异步提交到服务器, 所以有必要对正在提交的更改进行界面提示, 打算做个黄色alpha混和的渐变闪动效果来实现, 于是第一反应是做一个透明度不断变化的纯黄色GIF, 画到界面上去. 但是用GIMP
很早就知道AWT/SWING组件可以直接通过 Graphics.drawImage() 来显示 GIF 动画, 但是一直不太做界面程序, 也就没有仔细用过. 现在做 WoW Traverser, 因为修改是异步提交到服务器, 所以有必要对正在提交的更改进行界面提示, 打算做个黄色alpha混和的渐变闪动效果来实现, 于是第一反应是做一个透明度不断变化的纯黄色GIF, 画到界面上去. 但是用GIMP总是做出来效果不对, 于是想干脆自己写程序实现, 反正就是加个黄色的混和, 利用AWT显示GIF相同的机制, 效率和稳定性应该也不会差. 最后花了一天时间研究AWT的动画机制. 虽然也了解了一些原本不知道的细节, 但是结果还是让我很失望, 原来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.

蹩脚的AWT/SWING GIF显示

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号