BlackBerry應(yīng)用開發(fā)者指南 UI API篇之管理UI組件
我們承接前文《UI API篇之顯示UI組件》,本文我們將介紹如何管理UI組件。
管理UI組件
管理布局
使用 BlackBerry API 布局管理器來安排屏幕上的組件。
下面四個類擴(kuò)展了 Manager 類,以提供預(yù)定義的布局管理器:
◆VerticalFieldManager
◆HorizontalFieldManager
◆FlowFieldManager
◆DialogFieldManager
MainScreen 和 FullScreen 缺省的都使用了一個 VerticalFieldManager。僅為這些類定義一個布局管理器實例提供了不同的布局。
注:為了創(chuàng)建一個定制的布局管理器,請擴(kuò)展 Manager。
為一個指定的 Screen 實例定義布局管理器,完成下面的操作:
◆實例化合適的 Manager 子類。
◆加入 UI 組件到布局管理器中。
◆加入布局管理器到屏幕中。

Manager 類定義了多個系統(tǒng)樣式的常數(shù),這些系統(tǒng)樣式定義了如滾動和對齊的行為。當(dāng)創(chuàng)建布局管理器時,使用這些樣式作為參數(shù)。
垂直組織 field
VerticalFieldManager 垂直地組織 field。所有 field 在一新地線(line)上開始。為了可以垂直滾動,提供 Manager.VERTICAL_SCROLL 參數(shù)。

缺省地,BitmapField 對象在 VerticalFieldManager 中是左對齊的。
水平組織 field
HorizonFieldManager 水平組織field。為了可以水平滾動,提供Manager.HORIZONTAL_SCROLL 樣式。如果沒有包含 HORIZONTAL_SCROLL 參數(shù),field 水平排列他們自己,可能會超出屏幕寬度,但是用戶不能滾動到超出屏幕右邊的內(nèi)容。
BlackBerry 設(shè)備沒有顯示水平滾動指示器或滾動條。
![]()
水平垂直組織 Field
FlowFieldManager 先水平組織 field,然后再垂直組織。先水平組織 Field,直到?jīng)]有足夠空間放另外一個 field,然后管理器在下一行上水平的安排它們。首頁屏幕(Home Screen)就是一個 FlowFieldManager 的例子。
![]()
指定一個 PopupScreen的布局
DialogFieldManager 指定了 PopupScreen 對象的布局。它管理了一個圖標(biāo),一個消息,以及一列定制的 field 的布局。圖標(biāo)和消息相互靠近的出現(xiàn)在布局上方,定制的 field出現(xiàn)在消息的下方。這個布局是 PopupScreen 對象的標(biāo)準(zhǔn)布局。為了創(chuàng)建定制的對話框,擴(kuò)展 DialogFieldManager。

缺省地,BitmapField 對象在 VerticalFieldManager 中是左對齊的。
水平組織 field
HorizonFieldManager水平組織field 。 為了可以水平滾動,提供Manager.HORIZONTAL_SCROLL 樣式。如果沒有包含 HORIZONTAL_SCROLL 參數(shù),field 水平排列他們自己,可能會超出屏幕寬度,但是用戶不能滾動到超出屏幕右邊的內(nèi)容。BlackBerry 設(shè)備沒有顯示水平滾動指示器或滾動條。
水平垂直組織 Field
FlowFieldManager 先水平組織 field,然后再垂直組織。先水平組織 Field,直到?jīng)]有足夠空間放另外一個 field,然后管理器在下一行上水平的安排它們。首頁屏幕(Home Screen)就是一個 FlowFieldManager 的例子。
指定一個PopupScreen的布局
DialogFieldManager 指定了 PopupScreen 對象的布局。它管理了一個圖標(biāo),一個消息,以及一列定制的 field 的布局。圖標(biāo)和消息相互靠近的出現(xiàn)在布局上方,定制的 field出現(xiàn)在消息的下方。這個布局是 PopupScreen 對象的標(biāo)準(zhǔn)布局。為了創(chuàng)建定制的對話框,擴(kuò)展 DialogFieldManager。#p#
管理UI交互
一個時間只有一個線程(通常是事件調(diào)配線程)可以得到 UI 的訪問權(quán)。通過下列方式,背后(Background)線程也可從主事件處理或 UI 繪制代碼的外部訪問 UI:
◆獲取并保持事件鎖。
◆使用 invokeLater()或 invokeAndWait()在事件調(diào)配線程上運(yùn)行。
獲取并保持事件鎖
當(dāng)它處理一個消息時,事件調(diào)配者在事件線程上設(shè)置一個事件鎖。在沒有打斷事件調(diào)配者處理的情況下,背后線程(也就是,非事件調(diào)配線程)在短事件內(nèi)通過獲取這個鎖可以訪問UI。
為了得到事件鎖,調(diào)用 Application.getEventLock()。和這個對象同步,序列化訪問 UI。在短期內(nèi)保持這個鎖,因為鎖會暫停事件調(diào)配者。一個應(yīng)用程序應(yīng)該永遠(yuǎn)不要在 EventLock 對象上調(diào)用 notify()或 wait()。

在事件調(diào)配線程上運(yùn)行如果保持事件鎖不合適,創(chuàng)建一個實現(xiàn) Runnable 接口的類。在事件調(diào)配者上通過下面的 3種方法之一調(diào)用它的 run()方法:
◆調(diào)用 invokeAndWait(Runnable),以致在事件調(diào)配線程上立即調(diào)用 run()。這個調(diào)用會阻塞直到 run()完成為止。
◆調(diào)用 invokeLater(Runnable),以致在所有等候的事件處理后,在事件調(diào)配線程上調(diào)用run()。
◆調(diào)用 invokeLater(Runnable,long,boolean)以致在某一指定時間后,事件調(diào)配線程上調(diào)用 run()。在這里,在將 Runnable 加入到事件隊列之前,時間指定了等待時間的長短。如果 repeat 為 true,每隔 time 毫秒后,Runnable 加入到事件隊列中。#p#
管理前臺事件
系統(tǒng)調(diào)用 Application.activate()將應(yīng)用程序帶到前臺。
大多數(shù)的應(yīng)用程序不需要重寫 activate()。應(yīng)用程序應(yīng)該完成應(yīng)用程序構(gòu)造子的任何初始化,包括任何必需的 UiApplicaiton.pushScreen()調(diào)用.因為對同一個應(yīng)用程序,activate()能夠調(diào)用多次,因此在在這個方法中,應(yīng)用程序不應(yīng)該完成一次初始化。
當(dāng)帶到前臺時,應(yīng)用程序可以覆寫 activate()方法完成其他的附加處理。如果覆寫了 activate(),在方法的定義里調(diào)用 super.activate(),以致應(yīng)用程序能正確得重繪。
管理繪圖區(qū)域
使用 XYRect對象
Graphics 對象代表了應(yīng)用程序可用的整個繪圖表面。為了界定這個區(qū)域,將它分為多個XYRect 對象。XYRect 在圖形上下文(graphics context)的頂端創(chuàng)建一個矩形區(qū)域、一個XYRect 對象有 2 個 XYPoint 對象組成。***個 XYPoint 對象代表了 XYRect 左上方的坐標(biāo),第二個 XYPoint 對象代表了右下方的坐標(biāo)。每個 XYPoint 代表了一個由 X,Y 坐標(biāo)構(gòu)成的屏幕的坐標(biāo)。

Rectangle 對象將 XYRect 對象的上下文繪制區(qū)域界定為(10,10)與(50,50)之間的區(qū)域。為了開始對 XYRect 對象進(jìn)行繪圖調(diào)用,調(diào)用 pushContext()或 pushRegion( );
當(dāng)開始用 pushContext()進(jìn)行繪圖調(diào)用時,指定區(qū)域原點不要調(diào)整繪圖偏移(Drawingoffset)。

當(dāng)你首先調(diào)用 pushRegion()來調(diào)用繪圖方法時,區(qū)域源(Region Origin)需調(diào)整繪圖偏移,左上方的 XYPoint 對象代表了區(qū)域源。所有繪圖都通過這個數(shù)來偏移。
在下面的例子中,pushContext()將 XYRect 對象的 10 個象素位放到右邊,10 個放在下方。區(qū)域源調(diào)整了繪圖偏移(XYPoint topLeft = new XYPoint(10, 10)).

旋轉(zhuǎn)(Invert)個區(qū)域
旋轉(zhuǎn)一個 Graphics 對象上的一個區(qū)域,它保留像素,只是轉(zhuǎn)化像素值的位(也就是 0 變?yōu)?,1 變?yōu)?0)。大多數(shù) field 使用旋轉(zhuǎn)來表示焦點,盡管這樣,你可以為定制的 field 創(chuàng)建你自己的焦點行為。
為了旋轉(zhuǎn) Graphics 對象的任何一個區(qū)域,提供坐標(biāo)或者旋轉(zhuǎn)一個指定的 XYRect 對象。指定Graphics 對象的一個區(qū)域,并且壓入棧中。在調(diào)用 pushContext()或 pushRegion()后,提供Graphics 對象的一個區(qū)域來旋轉(zhuǎn)。

轉(zhuǎn)化(Translate) 一個區(qū)域
為了將一個 Graphics 上下文上的區(qū)域移動到另外一個地方。調(diào)用 invoke()。

XYRect 將點(1,1)轉(zhuǎn)化為(20,20,)。轉(zhuǎn) 化 后 ,XYRect 的底部擴(kuò)展了過去圖形上下文的范圍,并且重合了。
【編輯推薦】















 
 
 

 
 
 
 