新聞中心
很早就知道AWT和Swing組件可以直接通過 Graphics.drawImage() 來顯示 GIF 動畫, 但是一直不太做界面程序, 也就沒有仔細用過.

公司主營業(yè)務(wù):成都網(wǎng)站制作、成都網(wǎng)站設(shè)計、移動網(wǎng)站開發(fā)等業(yè)務(wù)。幫助企業(yè)客戶真正實現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競爭能力。創(chuàng)新互聯(lián)建站是一支青春激揚、勤奮敬業(yè)、活力青春激揚、勤奮敬業(yè)、活力澎湃、和諧高效的團隊。公司秉承以“開放、自由、嚴謹、自律”為核心的企業(yè)文化,感謝他們對我們的高要求,感謝他們從不同領(lǐng)域給我們帶來的挑戰(zhàn),讓我們激情的團隊有機會用頭腦與智慧不斷的給客戶帶來驚喜。創(chuàng)新互聯(lián)建站推出綏陽免費做網(wǎng)站回饋大家。
現(xiàn)在做 WoW Traverser, 因為修改是異步提交到服務(wù)器, 所以有必要對正在提交的更改進行界面提示, 打算做個黃色alpha混和的漸變閃動效果來實現(xiàn), 于是第一反應(yīng)是做一個透明度不斷變化的純黃色GIF, 畫到界面上去.
但是用GIMP總是做出來效果不對, 于是想干脆自己寫程序?qū)崿F(xiàn), 反正就是加個黃色的混和, 利用AWT和Swing顯示GIF相同的機制, 效率和穩(wěn)定性應(yīng)該也不會差. 最后花了一天時間研究AWT和Swing的動畫機制.
雖然也了解了一些原本不知道的細節(jié), 但是結(jié)果還是讓我很失望, 原來drawImage時就是把當前Component注冊為該圖片的ImageObserver, 這樣GIF的下一幀到了需要顯示的時間時, 通過 imageUpdated() 通知這個組件, 最終是在 java.awt.Component.imageUpdated() 中處理這個問題. 令人非常失望的是, Java都到了1.5了, AWT中這個地方的處理還是那么蹩腳, 它只是檢查了一下更新頻率有沒有超過系統(tǒng)規(guī)定的上限, 只要沒超過, 那么它就對Component發(fā)一個完全的repaint()請求, 甚至都沒有去計算該圖片的覆蓋區(qū)域, 設(shè)置一個Clip區(qū)域以減少不必要的繪圖操作.
更甚者, 即使之后你不再顯示這個GIF了, AWT也不會自動從這個『曾經(jīng)』顯示的圖片的ImageObserver列表中去掉這個Component, 最終導致的結(jié)果, 就是即使不再顯示那個GIF, 這個Component還是會以那個GIF的刷新頻率不斷的毫無必要的去repaint() !! 這不但蹩腳, 簡直都有點齷齪.
而且費了半天勁, 連手工去取消ImageObserver的接口都沒有找到, 也就是說: 如果不是永久性的顯示一個GIF, 千萬不要通過java.awt.Toolkit.createImage() 構(gòu)造 GIF 的 java.awt.Image對象然后往你自己的Component上畫, 否則這個GIF圖片將長時間占用內(nèi)存以及 ImageFetcher 線程的CPU資源, 同時耗費CPU時間和GUI資源用來絲毫沒有必要的反復repaint你的Component.
【編輯推薦】
- 在表格中Swing增加列表框
- 淺談Swing控件JList
- 概述Swing組件與外部線程
- Java Swing做什么好
- Swing文件選擇器的制作
當前標題:AWT和Swing顯示GIF 動畫
文章位置:http://fisionsoft.com.cn/article/dpjjgdd.html


咨詢
建站咨詢
