2013-08-01 108 views
0

我想用動畫GIF製作閃屏。我的GIF動畫有一個透明的背景,所以我想只顯示我的GIF的可見部分作爲閃屏。 首先,我必須指定我正在使用Matlab,所以不可能(或者我沒有找到如何)覆蓋組件/函數。 這裏我的示例代碼:Java動畫透明閃屏

win = javax.swing.JWindow; 
jl = javax.swing.JLabel(javax.swing.ImageIcon('C:\Users\ME\Documents\loader512-.gif')); 
win.getContentPane.add(jl); 
win.setAlwaysOnTop(true); 
win.pack; 
%% set the splash image to the center of the screen 
screenSize = win.getToolkit.getScreenSize; 
screenHeight = screenSize.height; 
screenWidth = screenSize.width; 
% get the actual splashImage size 
imgHeight = 512; 
imgWidth = 512; 
win.setLocation((screenWidth-imgWidth)/2,(screenHeight-imgHeight)/2); 
win.show 

它工作得很好shwing圖像,然而其背景是醚白色或灰色取決於窗口的透明度。 我也試圖玩JLabel的背景而沒有成功。

請幫忙!

回答

0

你的代碼存在的問題是每個給定的窗口都有一個特定的形狀。在不改變形狀的情況下,每個窗口對象都有一個矩形畫布,在其中繪製。透明度僅適用於在GIF圖像後面繪製對象的情況。如果啓用了透明度,則渲染器僅繪製背景顏色(通常爲黑色或白色或淺灰色),如果沒有其他內容存在。

自從Java 7發佈一個名爲setShape(Shape)的新方法以來,窗口對象出現。如果你的動畫GIF有一個固定的透明「區域」,我建議創建一個自定義的java.awt.Shape對象,通過設置的形狀傳遞給win對象。

例子:

win = javax.swing.JWindow; 
jl = javax.swing.JLabel(javax.swing.ImageIcon('C:\Users\ME\Documents\loader512-.gif')); 
win.getContentPane.add(jl); 
Shape S = createCustomShape(); //Create your shape 
win.setShape(S); 
win.setAlwaysOnTop(true); 
//{rest of code...} 

如果GIF動畫有一個變化的透明度的背景下,你必須創建一個複雜的實施中,響應GIF通過逐幀對Shape對象的更新。在我看來,如果是這樣的話,我不會打擾。 :)

閱讀Shape對象here的更多信息。

N.B.形狀「對象」實際上是一個接口,或者使用其中一個實現子類或創建自己的接口。

+0

謝謝!但setShape顯然不被認爲是類javax.swing.JWindow的一部分(我運行Java 8) – GuillaumeA

+0

我剛剛意識到Matlab使用Java 6,更新到Java 7是棘手的,因爲它使用JVM並且在Matlab中有一些與Java 7相關的問題/錯誤。 – GuillaumeA

+0

@G_A嗯......這可能不是理想的......但有一個叫靜態setShape(Window,Shape)的AWTUtilities類;方法,做同樣的事情。看看這個[site]的最後一段(http://docs.oracle.com/javase/tutorial/uiswing/misc/trans_shaped_windows.html)。這將只適用於Java 6和可能有問題的Java 7 ...它是一個非常鬼鬼祟祟的小班:) – initramfs