<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è)彈出通知部件

    Posted on 2009-07-02 15:14 Matthew Chen 閱讀(1272) 評論(1)  編輯  收藏 所屬分類: Java SE

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

    Example Image

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

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


    Shell

    我們想要一個(gè)shell停留在我們的程序的上方(但不是所有程序的上方),但不獲取焦點(diǎn)、顯示在你的任務(wù)管理器或是影響用戶關(guān)注的對象。 我們也不使用"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)部并且我們打算對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對象以給定的時(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被打開,我們在靜態(tài)的shell數(shù)組中保留一個(gè)引用。當(dāng)它淡出(并銷毀)后,從該列表中移除。因此,當(dāng)一個(gè)新的shell到來后我們查看當(dāng)前數(shù)組中已經(jīng)存在的元素并對每一個(gè)舊的shell-heightOfNewNotificationShell 因此,舊的shell上移以騰出空間,但繼續(xù)如前地完成它們的淡入/淡出周期。

    進(jìn)一步改善

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

    另外請注意,我目前使用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) 。

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

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

    下載代碼

    結(jié)論

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

    Feedback

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

    2009-07-03 14:09 by 瑜伽館
    最近正想用,學(xué)習(xí)啦!
    主站蜘蛛池模板: 一级毛片免费一级直接观看| 亚洲色大成WWW亚洲女子| jizz在线免费播放| 亚洲中文字幕无码不卡电影| 亚洲精品狼友在线播放| 精品熟女少妇aⅴ免费久久| 亚洲午夜激情视频| 亚洲综合精品一二三区在线| 成全在线观看免费观看大全| 亚洲人成亚洲人成在线观看| 久久久精品免费国产四虎| 亚洲精品国产成人99久久| 在线视频精品免费| 亚洲va久久久久| 99精品热线在线观看免费视频| 国产又黄又爽又猛的免费视频播放| 亚洲hairy多毛pics大全| 无码专区一va亚洲v专区在线| 爱情岛论坛免费视频| 中文字幕人成人乱码亚洲电影| 免费黄网站在线看| 亚洲一级毛片视频| 国产免费小视频在线观看| 人禽伦免费交视频播放| 噜噜嘿在线视频免费观看| 美女啪啪网站又黄又免费| 亚洲熟妇无码八AV在线播放| 91精品啪在线观看国产线免费| 亚洲乱码在线观看| 亚洲精品国产高清不卡在线| 日本免费一区二区三区四区五六区| 亚洲人成网站在线观看播放动漫| 精品剧情v国产在免费线观看| 黄色网页在线免费观看| 亚洲精品国产第1页| 国产jizzjizz视频全部免费| 日本免费在线中文字幕| 亚洲国产精品ⅴa在线观看| 国产国拍亚洲精品福利 | 国产亚洲大尺度无码无码专线| 久久久免费的精品|