這個特效不知道取什麼名字好,就叫緩慢展開或消失吧,整個效果就像是一張紙一樣慢慢拉出來或縮進去。這個效果的實現也比較簡單,主要是通過設置shell的size來實現的,通常我們會有四種效果,即從左到右慢慢展現和消失、從右到左慢慢展現和消失、從上到下慢慢展現和消失、從下到上慢慢展現和消失。下面分別說明如下:
1.從左到右慢慢展現
這個效果實現的思路就是shell的location不變,剛開始設置shell的size的寬度爲0,高度不變,然後逐步的將shell的width增加,從而就實現了shell的緩慢打開。代碼如下:
final int width = shell.getSize().x;
final int startX = shell.getLocation().x;
new Thread(new Runnable() {
private int startWidth = 0;
public void run() {
while (startWidth <= width) {
shell.getDisplay().syncExec(new Runnable() {
public void run() {
shell.setSize(++ startWidth, shell.getSize().y);
}
});
Thread.yield(); // 暫停
}
}
}).start();
注意,我們是將每一次修改的操作都當成一個Runnable來執行的,而不是把整個while循環放在一個Runnable中執行,這樣是爲了避免Display執行Runnable時無法處理其他響應事件,從而導致展開效果並不流暢!另外,即使使用asyncExec執行也是一樣的效果!
2.從右到左慢慢展現
從右到左的慢慢展現效果實現的思路和從左到右其實是一樣的,只不過增加了一個同時設置shell的location的操作,這樣我們纔可以模擬從右邊到左邊慢慢打開的效果。實現代碼如下:
final int width = shell.getSize().x;
final int startX = shell.getLocation().x;
new Thread(new Runnable() {
private int startWidth = 0;
public void run() {
while (startWidth <= width) {
shell.getDisplay().syncExec(new Runnable() {
public void run() {
shell.setSize(++ startWidth, shell.getSize().y);
shell.setLocation(startX + width - startWidth, shell.getLocation().y);
}
});
Thread.yield();
}
}
}).start();
3.從左到右慢慢消失
慢慢消失的實現思路是逐步的改變shell的size,從左到右慢慢消失就是shell的高度不變,width從原始的寬度慢慢減小到0,同時還需要同步設置shell的location,以保證右邊總是在同一個位置。代碼如下:
final int shellWidth = shell.getSize().x;
final int shellStartX = shell.getLocation().x;
new Thread() {
private int width = shellWidth;
private int startX = shellStartX;
public void run() {
while (width > 0) {
shell.getDisplay().syncExec(new Runnable() {
public void run() {
shell.setSize(-- width, shell.getSize().y);
shell.setLocation(++ startX, shell.getLocation().y);
}
});
Thread.yield();
}
}
}.start();
在消失完畢後,你還可以選擇將shell關閉或是重新恢復到以前的大小和位置,那麼就需要記錄shell開始的size和location了。
4.從右到左慢慢消失
從右到左慢慢消失相比從左到右慢慢消失只是少了一個重新設置shell的location的操作,其代碼如下:
final int shellWidth = shell.getSize().x;
final int shellStartX = shell.getLocation().x;
new Thread() {
private int width = shellWidth;
private int startX = shellStartX;
public void run() {
while (width > 0) {
shell.getDisplay().syncExec(new Runnable() {
public void run() {
shell.setSize(-- width, shell.getSize().y);
}
});
Thread.yield();
}
}
}.start();
5.從上到下慢慢顯示
實現思路就是shell的location不變,shell的width不變,將shell的height從0慢慢增加到shell的實際高度即可。代碼也比較簡單,就不重複寫了,留給大家自己寫吧,呵呵。
6.從上到下慢慢消失
實現思路就是shell的width不變,逐步的將shell的height從原始高度變到0,同時height每減少1,則將其location的y增加1,從而保證shell的底部總是在同一位置,而頂部則是在逐步的下移,從而實現效果,代碼略。
7.從下到上慢慢顯示
實現思路就是shell的width不變,將高度逐步的由0變成原始的高度,同時也需要同步改變shell的location,高度每增加1,則shell的location的y則減1.代碼略。
8.從下到上慢慢消失
實現思路就是shell的width不變,將height由原始的高度慢慢減小到0,其location不變,代碼略。
以上就是對shell的size和location的改變來實現慢慢消失或顯示的效果,這也是一個很簡單的窗口特效了。後面將繼續給大家介紹SWT窗口的其他特效,如百葉窗的打開和關閉特效、圓形消失和顯示特效等等:-)