<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Picses' sky

    Picses' sky
    posts - 43, comments - 29, trackbacks - 0, articles - 24

    在本文中我將解釋如何創(chuàng)建一個(gè)自定義的部件,它在屏幕右下角顯示一個(gè)彈出通知對(duì)話框(Windows中通常是在工具欄上面) 。 以下是完成時(shí)它的樣子:

    Example Image

    我們可以在組件上繪制一切來定制我們所需要的各種控制,但這篇文章的目的在于使用基本的SWT組件在一個(gè)普通的Shell中實(shí)現(xiàn)比典型SWT Shell更加美觀的效果。

    (注意,僅在Windows上進(jìn)行過測(cè)試,在其它平臺(tái)上可能有所不同) 。


    Shell

    我們想要一個(gè)shell停留在我們的程序的上方(但不是所有程序的上方),但不獲取焦點(diǎn)、顯示在你的任務(wù)管理器或是影響用戶關(guān)注的對(duì)象。 我們也不使用"trim"來給Shell加邊框而是繪制自定義的邊框。我們所有的要求都可以通過SWT的flags參數(shù)方便的創(chuàng)建。我們可以如下創(chuàng)建Shell:


    
    
    1. _shell = new Shell(Display.getDefault().getActiveShell(), SWT.NO_FOCUS | SWT.NO_TRIM); 

    由于我們的SWT組件在shell內(nèi)部并且我們打算對(duì)shell本身使用漸變背景,所有的組件都必須是透明的。通過在shell上設(shè)置背景色模式為SWT.INHERIT_DEFAULT來實(shí)現(xiàn)。它告訴組建繼承它們父組件的背景色。在創(chuàng)建shell之后我們簡單調(diào)用:

    
    
    1. _shell.setBackgroundMode(SWT.INHERIT_DEFAULT); 

    那么如何在shell上得到漸變的背景色呢?默認(rèn)方式下是不支持的。你可以設(shè)置一個(gè)前景色和一個(gè)背景色但也就只能如此了。技巧是我們使用我們想要的顏色繪制一個(gè)圖像來作為shell的背景。為了在合適的時(shí)間做到這一點(diǎn),我們監(jiān)聽shell上的SWT.Resize事件,代碼如下;

    
    
    1. _shell.addListener(SWT.Resize, new Listener() { 
    2.     @Override 
    3.     public void handleEvent(Event e) { 
    4.     try { 
    5.         // get the size of the drawing area 
    6.         Rectangle rect = _shell.getClientArea(); 
    7.         // create a new image with that size 
    8.         Image newImage = new Image(Display.getDefault(), Math.max(1, rect.width), rect.height); 
    9.         // create a GC object we can use to draw with 
    10.         GC gc = new GC(newImage); 
    11.  
    12.         // fill background 
    13.         gc.setForeground(_bgFgGradient); 
    14.         gc.setBackground(_bgBgGradient); 
    15.         gc.fillGradientRectangle(rect.x, rect.y, rect.width, rect.height, true); 
    16.  
    17.         // draw shell edge 
    18.         gc.setLineWidth(2); 
    19.         gc.setForeground(_borderColor); 
    20.         gc.drawRectangle(rect.x + 1, rect.y + 1, rect.width - 2, rect.height - 2); 
    21.         // remember to dipose the GC object! 
    22.         gc.dispose(); 
    23.  
    24.         // now set the background image on the shell 
    25.         _shell.setBackgroundImage(newImage); 
    26.  
    27.         // remember/dispose old used iamge 
    28.         if (_oldImage != null) { 
    29.         _oldImage.dispose(); 
    30.         } 
    31.         _oldImage = newImage; 
    32.     } 
    33.     catch (Exception err) { 
    34.         err.printStackTrace(); 
    35.     } 
    36.     } 
    37. }); 

    內(nèi)容

    我們的shell由3個(gè)部分組成,圖片在左上角(一個(gè)普通的CLabel ) 。 然后一個(gè)包含標(biāo)題文字的標(biāo)簽(也是CLabel ) ,最后一個(gè)標(biāo)簽顯示我們的信息(一個(gè)普通的Label) 。 我們最后使用一個(gè)Label而不是CLabel來支持比CLabel更佳的斷行和多行效果。 您當(dāng)然也可以使用幾乎任何你想要的組建。 以下是用線框分割的每個(gè)標(biāo)簽:

    tray_popup_example_lines

    我們使用邊緣間隔5px的GridLayout(除頂部)除此之外沒有特別的效果創(chuàng)建,所以我就不在這里寫出代碼了(在底部供下載) 。

    一些眼球效果-凋謝

    在3.4的SWT中Shells支持alpha值設(shè)置,所以我們將以此來實(shí)現(xiàn)更美觀的"呈現(xiàn)"和"消失",所有我們所需要做的就是在一個(gè)線程中循環(huán)增加/減少shell的alpha通道值來實(shí)現(xiàn)shell的淡入和淡出消失。我們必須在Display線程上來做這些操作,為此提供了一個(gè)runnable讓Display對(duì)象以給定的時(shí)間間隔運(yùn)行。

    在多線程的環(huán)境下記得始終檢查shell是否已經(jīng)被銷毀了。當(dāng)?shù)腼@示完成后,我們希望shell顯示一定時(shí)間然后消失掉,所以基本的流程鏈?zhǔn)?/span>

    • 創(chuàng)建shell
    • 淡入shell
    • 可的X秒
    • 淡出shell
    • 銷毀shell

    所有的這些定時(shí)器或多或少就如編碼中的那樣,所以我僅提供了一個(gè)例子其余的可以參考下載中的完整代碼方面,我們需要解釋一些全局的變量

    • FADE_IN_STEP是每次迭代中alpha值的增量。
    • FINAL_ALPHA是當(dāng)shell保持可見時(shí)的alpha值。一定透明度的shell將提供更佳的效果,所以默認(rèn)該值是225(255則為一個(gè)完全[不透明]的shell) 。
    • FADE_TIMER是alpha變化的時(shí)間間隔。當(dāng)shell達(dá)到它的最大alpha值時(shí)調(diào)用startTimer()方法,這是一個(gè)線程,休眠若干秒,然后調(diào)用fadeOut()方法。
    
    
    1. private static void fadeIn(final Shell _shell) { 
    2.     Runnable run = new Runnable() { 
    3.  
    4.         @Override 
    5.         public void run() { 
    6.             try { 
    7.                 if (_shell == null || _shell.isDisposed()) { return; } 
    8.  
    9.                 int cur = _shell.getAlpha(); 
    10.                 cur += FADE_IN_STEP; 
    11.  
    12.                 if (cur > FINAL_ALPHA) { 
    13.                     _shell.setAlpha(FINAL_ALPHA); 
    14.                     startTimer(_shell); 
    15.                     return
    16.                 } 
    17.  
    18.                 _shell.setAlpha(cur); 
    19.                 Display.getDefault().timerExec(FADE_TIMER, this); 
    20.             } 
    21.             catch (Exception err) { 
    22.                 err.printStackTrace(); 
    23.             } 
    24.         } 
    25.  
    26.     }; 
    27.     Display.getDefault().timerExec(FADE_TIMER, run); 

    堆疊的通知

    最后我們要支持的,是堆疊通知。 假設(shè)我們的通知shell的整個(gè)生命周期是5秒,如果有額外的通知在第一個(gè)通知關(guān)閉之前到達(dá)呢?我們可以銷毀第一個(gè)通知,并以后者取代,但更美觀的方法是簡單地將前者升高,讓后者顯示在前者的下方。效果如下(截屏?xí)r之前的shell開始淡出,所以它們有更高的透明度) :

    tray_stacked

    實(shí)現(xiàn)這一效果是相當(dāng)簡單的。 每次通知shell被打開,我們?cè)陟o態(tài)的shell數(shù)組中保留一個(gè)引用。當(dāng)它淡出(并銷毀)后,從該列表中移除。因此,當(dāng)一個(gè)新的shell到來后我們查看當(dāng)前數(shù)組中已經(jīng)存在的元素并對(duì)每一個(gè)舊的shell-heightOfNewNotificationShell。 因此,舊的shell上移以騰出空間,但繼續(xù)如前地完成它們的淡入/淡出周期。

    進(jìn)一步改善

    當(dāng)然一切都可以做得更加美觀,也許你想要一個(gè)“ X ”關(guān)閉按鈕,或不同顏色的文字,或圓角邊框。 當(dāng)前代碼中并沒有實(shí)現(xiàn)這些,但為你實(shí)現(xiàn)大多數(shù)功能避免問題

    另外請(qǐng)注意,我目前使用Display.getDefault().getActiveShell()作為彈出窗口的夫shell。您可能想把它重構(gòu)為一個(gè)永久性的shell以便在任何父shell被銷毀或任何彈出窗被顯示的時(shí)候都能使通知被銷毀。

     

    代碼不是十全十美的,卻可以作為構(gòu)建的基礎(chǔ)(如果你愿意的話) 。

    下載代碼

    我已創(chuàng)建了一個(gè)基于Eclipse項(xiàng)目的代碼,ImageCache / FontCache / ColorCache(它們的目的是為了緩存圖片等系統(tǒng)資源)。 還有一個(gè)用來存放圖片的jar。 如果你喜歡它們,可以找到更多: Gnome的顏色圖標(biāo) 。

    請(qǐng)注意您可能需要調(diào)整您的CLASSPATH設(shè)置的項(xiàng)目,以對(duì)應(yīng)自己的SWT jar所在。

    運(yùn)行Tester.java然后按下按鈕啟動(dòng)通知。在前一個(gè)通知消失前再次按下隨機(jī)圖像將顯示。

    下載代碼

    結(jié)論

    希望這可讓您深入了解如何創(chuàng)建“自定義部件” (沒有多少定制繪畫)。 玩得開心!

    Feedback

    # re: [翻譯]創(chuàng)建一個(gè)彈出通知部件  回復(fù)  更多評(píng)論   

    2009-07-03 14:09 by 瑜伽館
    最近正想用,學(xué)習(xí)啦!
    主站蜘蛛池模板: 亚洲人成网站日本片| 久操视频在线免费观看| 免费高清在线爱做视频| 亚洲麻豆精品果冻传媒| 97在线免费观看视频| 亚洲精品无码永久在线观看 | 亚洲精品无码专区2| 亚洲av永久无码| a级毛片无码免费真人| 亚洲欧洲日韩国产| 999久久久免费精品播放| 亚洲精品二区国产综合野狼| 有码人妻在线免费看片| 婷婷综合缴情亚洲狠狠尤物| 精品亚洲国产成人av| 在线免费观看中文字幕| 亚洲中文字幕乱码一区| 无码永久免费AV网站| 亚洲国产最大av| 在线观看AV片永久免费| 亚洲av一本岛在线播放| 无限动漫网在线观看免费| 亚洲三级中文字幕| 在线a级毛片免费视频| 亚洲中文字幕无码av在线| 99视频全部免费精品全部四虎| 亚洲毛片免费视频| 天天影视色香欲综合免费| 亚洲视频免费播放| 免费视频爱爱太爽了| 亚洲乱码卡一卡二卡三| 亚洲欧洲免费无码| 在线a亚洲老鸭窝天堂av高清| 最近中文字幕mv免费高清视频7 | 亚洲av日韩综合一区久热| 日韩特黄特色大片免费视频| 亚洲国产欧美日韩精品一区二区三区| 大学生a级毛片免费观看| 亚洲AV无码男人的天堂| 国产aa免费视频| 日日摸夜夜添夜夜免费视频|