新聞中心
很早就知道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án)謹(jǐn)、自律”為核心的企業(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時就是把當(dāng)前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, 最終導(dǎo)致的結(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資源用來絲毫沒有必要的反復(fù)repaint你的Component.
【編輯推薦】
- 在表格中Swing增加列表框
- 淺談Swing控件JList
- 概述Swing組件與外部線程
- Java Swing做什么好
- Swing文件選擇器的制作
當(dāng)前文章:AWT和Swing顯示GIF 動畫
本文URL:http://www.5511xx.com/article/dpjjgdd.html


咨詢
建站咨詢
