2013-08-01 3 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

Проблема с вашим кодом заключается в том, что каждое данное окно имеет определенную определенную форму. Без изменения формы каждый объект Window имеет прямоугольный холст, на который он опирается. Прозрачность применяется только в том случае, если вы рисуете объект за вашим GIF-изображением. Если прозрачность включена, визуализатор просто рисует фоновый цвет (обычно черный или белый или немного светло-серый), если ничего другого нет.

С момента выпуска Java 7 появился новый метод, называемый setShape (Shape); для объектов Window. Если ваш анимированный 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 имеет изменяющуюся прозрачность фона, необходимо создать комплексную реализацию, в которой обновления объекта Shape на покадровой основе в ответ на GIF. На мой взгляд, если это так, я бы не стал беспокоиться. :)

Подробнее о объекте Shape here.

N.B. «Объект» «Форма» на самом деле является интерфейсом, либо использует один из реализующих подклассов, либо создает свои собственные.

+0

Спасибо! но setShape, по-видимому, не признается частью класса javax.swing.JWindow (я запускаю Java 8). – GuillaumeA

+0

Я только понимаю, что Matlab использует Java 6, и сложно обновить до Java 7, поскольку использует JVM и что есть некоторые проблемы/ошибки, связанные с Java 7 в Matlab. – GuillaumeA

+0

@ G_A Ну ... Это может быть не идеально ... но есть класс AWTUtilities со статическим setShape (Window, Shape); метод, который делает то же самое. Проверьте последний абзац этого [сайта] (http://docs.oracle.com/javase/tutorial/uiswing/misc/trans_shaped_windows.html). Это будет работать только для java 6 и может иметь проблемы с java 7 ... Его очень подлый маленький класс :) – initramfs

Смежные вопросы