2012-11-03 88 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(); 
    } 
}