BlackBerry應用開發(fā)者指南 UI API篇之管理UI組件
我們承接前文《UI API篇之顯示UI組件》,本文我們將介紹如何管理UI組件。
管理UI組件
管理布局
使用 BlackBerry API 布局管理器來安排屏幕上的組件。
下面四個類擴展了 Manager 類,以提供預定義的布局管理器:
◆VerticalFieldManager
◆HorizontalFieldManager
◆FlowFieldManager
◆DialogFieldManager
MainScreen 和 FullScreen 缺省的都使用了一個 VerticalFieldManager。僅為這些類定義一個布局管理器實例提供了不同的布局。
注:為了創(chuàng)建一個定制的布局管理器,請擴展 Manager。
為一個指定的 Screen 實例定義布局管理器,完成下面的操作:
◆實例化合適的 Manager 子類。
◆加入 UI 組件到布局管理器中。
◆加入布局管理器到屏幕中。
Manager 類定義了多個系統(tǒng)樣式的常數(shù),這些系統(tǒ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 設備沒有顯示水平滾動指示器或滾動條。
水平垂直組織 Field
FlowFieldManager 先水平組織 field,然后再垂直組織。先水平組織 Field,直到?jīng)]有足夠空間放另外一個 field,然后管理器在下一行上水平的安排它們。首頁屏幕(Home Screen)就是一個 FlowFieldManager 的例子。
指定一個 PopupScreen的布局
DialogFieldManager 指定了 PopupScreen 對象的布局。它管理了一個圖標,一個消息,以及一列定制的 field 的布局。圖標和消息相互靠近的出現(xiàn)在布局上方,定制的 field出現(xiàn)在消息的下方。這個布局是 PopupScreen 對象的標準布局。為了創(chuàng)建定制的對話框,擴展 DialogFieldManager。
缺省地,BitmapField 對象在 VerticalFieldManager 中是左對齊的。
水平組織 field
HorizonFieldManager水平組織field 。 為了可以水平滾動,提供Manager.HORIZONTAL_SCROLL 樣式。如果沒有包含 HORIZONTAL_SCROLL 參數(shù),field 水平排列他們自己,可能會超出屏幕寬度,但是用戶不能滾動到超出屏幕右邊的內(nèi)容。BlackBerry 設備沒有顯示水平滾動指示器或滾動條。
水平垂直組織 Field
FlowFieldManager 先水平組織 field,然后再垂直組織。先水平組織 Field,直到?jīng)]有足夠空間放另外一個 field,然后管理器在下一行上水平的安排它們。首頁屏幕(Home Screen)就是一個 FlowFieldManager 的例子。
指定一個PopupScreen的布局
DialogFieldManager 指定了 PopupScreen 對象的布局。它管理了一個圖標,一個消息,以及一列定制的 field 的布局。圖標和消息相互靠近的出現(xiàn)在布局上方,定制的 field出現(xiàn)在消息的下方。這個布局是 PopupScreen 對象的標準布局。為了創(chuàng)建定制的對話框,擴展 DialogFieldManager。#p#
管理UI交互
一個時間只有一個線程(通常是事件調(diào)配線程)可以得到 UI 的訪問權。通過下列方式,背后(Background)線程也可從主事件處理或 UI 繪制代碼的外部訪問 UI:
◆獲取并保持事件鎖。
◆使用 invokeLater()或 invokeAndWait()在事件調(diào)配線程上運行。
獲取并保持事件鎖
當它處理一個消息時,事件調(diào)配者在事件線程上設置一個事件鎖。在沒有打斷事件調(diào)配者處理的情況下,背后線程(也就是,非事件調(diào)配線程)在短事件內(nèi)通過獲取這個鎖可以訪問UI。
為了得到事件鎖,調(diào)用 Application.getEventLock()。和這個對象同步,序列化訪問 UI。在短期內(nèi)保持這個鎖,因為鎖會暫停事件調(diào)配者。一個應用程序應該永遠不要在 EventLock 對象上調(diào)用 notify()或 wait()。
在事件調(diào)配線程上運行如果保持事件鎖不合適,創(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()將應用程序帶到前臺。
大多數(shù)的應用程序不需要重寫 activate()。應用程序應該完成應用程序構造子的任何初始化,包括任何必需的 UiApplicaiton.pushScreen()調(diào)用.因為對同一個應用程序,activate()能夠調(diào)用多次,因此在在這個方法中,應用程序不應該完成一次初始化。
當帶到前臺時,應用程序可以覆寫 activate()方法完成其他的附加處理。如果覆寫了 activate(),在方法的定義里調(diào)用 super.activate(),以致應用程序能正確得重繪。
管理繪圖區(qū)域
使用 XYRect對象
Graphics 對象代表了應用程序可用的整個繪圖表面。為了界定這個區(qū)域,將它分為多個XYRect 對象。XYRect 在圖形上下文(graphics context)的頂端創(chuàng)建一個矩形區(qū)域、一個XYRect 對象有 2 個 XYPoint 對象組成。***個 XYPoint 對象代表了 XYRect 左上方的坐標,第二個 XYPoint 對象代表了右下方的坐標。每個 XYPoint 代表了一個由 X,Y 坐標構成的屏幕的坐標。
Rectangle 對象將 XYRect 對象的上下文繪制區(qū)域界定為(10,10)與(50,50)之間的區(qū)域。為了開始對 XYRect 對象進行繪圖調(diào)用,調(diào)用 pushContext()或 pushRegion( );
當開始用 pushContext()進行繪圖調(diào)用時,指定區(qū)域原點不要調(diào)整繪圖偏移(Drawingoffset)。
當你首先調(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)).
旋轉(Invert)個區(qū)域
旋轉一個 Graphics 對象上的一個區(qū)域,它保留像素,只是轉化像素值的位(也就是 0 變?yōu)?,1 變?yōu)?0)。大多數(shù) field 使用旋轉來表示焦點,盡管這樣,你可以為定制的 field 創(chuàng)建你自己的焦點行為。
為了旋轉 Graphics 對象的任何一個區(qū)域,提供坐標或者旋轉一個指定的 XYRect 對象。指定Graphics 對象的一個區(qū)域,并且壓入棧中。在調(diào)用 pushContext()或 pushRegion()后,提供Graphics 對象的一個區(qū)域來旋轉。
轉化(Translate) 一個區(qū)域
為了將一個 Graphics 上下文上的區(qū)域移動到另外一個地方。調(diào)用 invoke()。
XYRect 將點(1,1)轉化為(20,20,)。轉 化 后 ,XYRect 的底部擴展了過去圖形上下文的范圍,并且重合了。
【編輯推薦】