2012-11-03 115 views
0

我有我的自定義小部件,當懸停時改變背景。它工作的很好,但我希望在沒有背景和懸停背景之間平滑過渡。它將與GC.setAlpha()工作,但:display.async和平滑過渡

Display.getDefault().asyncExec(new Runnable() { 
    public void run() { 
     for (int i=0;i<255;i++) { 
      setBG(BGHelper(imgHover,i)); //i - alpha 
      try { 
       Thread.sleep(1); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
     } 
    } 
}); 

此代碼等到i == 255,但它並沒有顯示的平滑過渡。爲什麼?

+0

您能否更詳細地描述「_it不顯示平滑過渡_」的含義? – Baz

+0

我希望看到從alpha 0到255(從不可見到可見)的平滑過渡,但是當我懸停我的小部件時,需要1 * 255毫秒,並且可以看到完全可見的圖像(無步驟)。 – Andy

+1

「Runnable」(最終)由UI線程執行,您正在使用Thread.sleep()暫停該線程。用一個'Timer'來定期更新alpha。 – Torious

回答

3

這不能工作,因爲只要你在你的代碼SWT不會重新繪製或更改組件。

您應該在單獨的線程中完成這項工作,並且每次更改都請致電Display.asyncExec

for (int i = 0; i < 255; i++) { 
    final int x = i; 
    Display.getDefault().asyncExec(new Runnable() { 
     public void run() { 
      setBG(BGHelper(imgHover,x)); //x - alpha 
     } 
    }); 
    try { 
     Thread.sleep(1); 
    } catch (InterruptedException e) { 
     e.printStackTrace(); 
    } 
}