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