lwuit 全面剖析
在MIDlet中初始化Lwuit 也是唯一使用原有J2me的東西
可以在startApp方法中定義啟動的過程
public void startApp() {
//init the LWUIT Display
Display.init(this);
//載入資原始檔
try {
Resources r = Resources.open("/myresources.res");
UIManager.getInstance().setThemeProps(r.getTheme(r.getThemeResourceNames()[0]) );
} catch (java.io.IOException e) {
}
簡單的使用一個內建Form進行顯示,而無須使用一個而外的類
Form. f = new Form();
f.setTitle("Hello World");
f.setLayout(new BorderLayout());
f.addComponent("Center", new Label("I am a Label"));
f.show();
注意使用show方法進行顯示
元件介紹
Component 用於顯示到頁面上的基礎部分,可以理解為DisplayObject,也就是元件部分
Container 用於儲存多個Components的容器型別,提供了佈局的能力
Form. 提供title和menus,並且提供一個content放置Components,並且提供了content的滾動能力
addComponent,用於新增Components到Content中
提供的一些方法和使用方式
Form. mainForm. = new Form("Form. Title"); //宣告一個帶標題的Form.
mainForm.setLayout(new BorderLayout()); //設定佈局管理器
mainForm.addComponent(BorderLayout.CENTER, new Label(“Hello,World”)); //新增Components元件,
mainForm.setTransitionOutAnimator(CommonTransitions.createFade(400)); //設定動畫
mainForm.addCommand(new Command("Run", 2)); //新增選單命令
mainForm.show(); //顯示Form.
一些技巧
1:可以使用帶引數的建構函式,設定標題.也可以不設定標題的建構函式
2:addComponent() 方法提供兩個過載,區別在於是否指定佈局位置
3:Transition動畫用於在forms之間進行切換時候觸發
4:Form通過Commands新增選單,根據新增順序排序顯示,其他使用與普通的J2me一樣
Label: 可以同時顯示圖片和文字,設定align佈局,可以通過繼承Label實現擴充套件,如果更復雜,可以使用Button
提供的一些方法和使用方式
Label textLabel = new Label("I am a Label"); //建立一個單行文字
Image icon = Image.createImage("/images/duke.png");
Label imageLabel = new Label(icon); //建立一個帶圖片的Label
setTextPosition(int alignment); //設定佈局方式,CENTER, LEFT, RIGHT,LEFT,TOP, BOTTOM, LEFT, RIGHT,
Button 可以用於觸發一個點選的事件Action,使用一個ActionListeners 進行監聽
final Button button = new Button("Old Text");
button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
button.setText("New Text");
}}); //使用匿名的ActionListener介面實現類進行監聽
Button繼承Label, 所以可以設定不同圖文混編的風格,並且提供了三種狀態ollover, pressed, and the default
state
RadioButton 單選按鈕,繼承自Button
RadioButton radioButton = new RadioButton(“Radio Button”);
同樣,也會觸發action
ButtonGroup 用於保證RadioButton只能選中一項
RadioButton rb1 = new RadioButton("First RadioButton in Group 1");
RadioButton rb2 = new RadioButton("Second RadioButton in Group 1");
ButtonGroup group1 = new ButtonGroup();
group1.add(rb1);
group1.add(rb2);
exampleContainer.addComponent(rb1);
exampleContainer.addComponent(rb2);
這裡需要注意,只需要新增addComponent(RadioButton) 到容器中,不需要新增ButtonGroup,只用於後臺管理
CheckBox 多選框,不需要新增到group中,同樣也觸發事件
final CheckBox checkBox = new CheckBox(“Check Box”);
通過checkBox.isSelected() 判斷是否被選中
ComboBox 列表,只允許一個被選中,多用於空間有限時候提供多選項的單選功能
建立需要一個陣列作為資料來源
String[] content = { "Red", "Blue", "Green", "Yellow" };
ComboBox comboBox = new ComboBox(content); //建立一個Combox,在這個建構函式中也是使用List實現
comboBox.setListCellRenderer(new checkBoxRenderer()); //設定renderer 渲染器
也可以使用addActionListener註冊事件
通過實現不同的renderer介面可以給元件提供不同的顯示效果 implements ListCellRenderer
TextArea
例子
TextArea textArea = new TextArea(5, 20, TextArea.NUMERIC);
textArea.setEditable(false);
建構函式的前兩個引數為 總行數和單行長度,第三個引數用於傳遞到本地文字輸入,用於指定限制的型別
可以使用TextArea的常量 ANY,EMAILADDR, NUMERIC, PHONENUMBER, URL, or DECIMAL,PASSWORD, UNEDITABLE, SENSITIVE,NON_PREDICTIVE, INITIAL_CAPS_SENTENCE, INITIAL_CAPS_WORD.也可以使用 | 設定複合約束
預設下可編輯
TabbedPane 通過類似Tab的選項卡方式並排放置一組容器,容器的tab標籤可以使用圖文混編方式
可以使用addTab or insertTab methods 方法新增容器
removeTabAt(int index) 移除容器
tab的索引由0開始
tab標籤可以有四種不同的放置方法 LEFT, RIGHT, TOP or BOTTOM using the setTabPlacement method.
TabbedPane tabbedPane = new TabbedPane(TabbedPane.TOP);
tabbedPane.addTab("Tab 1", new Label("I am a TabbedPane!"));
tabbedPane.addTab("Tab 2", new Label("Tab number 2"));
建構函式使用一個Tab標籤佈局的常量作為引數
addTab,第一個為tab標籤名,第二個引數為直接放置到容器中的內容
Using Lists
List,使用Swing的 MVC模式進行建立
rendered using a ListCellRenderer and are extracted using the ListModel.
使用ListCellRenderer 作為顯示的V
使用ListModel. 作為資料來源M
其他部分為C進行操作
建立List 有四個建構函式
List()
List(ListModel model) //直接例項化ListModel
List(Object[] items) //Array陣列
List(Vector items) //Vector集合
ListModel 也可以分為自定ListModel的實現,以及DefaultListModel
DefaultListModel的使用
String[] items = { "Red", "Blue", "Green", "Yellow" };
DefaultListModel myListModel = new DefaultListModel(items); //使用Array作為資料來源
ListCellRenderer 渲染器
同樣也可以自定ListCellRenderer的實現,以及DefaultListCellRenderer
自定義的時候,可以通過繼承Libel,來節約開發的速度 ,主要實現兩個方法
public class MyYesNoRenderer extends Label implements ListCellRenderer{
public Component getListCellRendererComponent(List list,
Object value, int index, boolean isSelected) {
((Boolean)value).booleanValue() 來獲取單項的值
}
public Component getListFocusComponent(List list) {
Label label = new label("");
label.getStyle().setBgTransparency(100);
return label;
}}
DefaultListCellRenderer,預設也是使用Label and the ListCellRenderer interface.
實現兩個方法,大體和上面相同
getListCellRendererComponent()
getListFocusComponent() //選中風格,可以通過修改透明度來表現
新增或移除item
新增的方法有兩種,建立一個ListModel,然後add到list中,重置一個List 使用setModel(ListModel model). 方法
移除的方法有removeItem(int index) or removeAll() methods.
myListModel.addItem(“New Item”); //新增Item
myListModel.removeItem(index); //刪除Item
myListModel.removeAll(); //刪除所有Item
List 事件 提供了兩種事件 ActionEvent and SelectionsListener
addFocusListener(FocusListener l) 區別於常用的Action
SelectionListener 應該會更有用一些
Fixed Selection Feature 應該是隻有一行的List,不彈出選單的模式 //具體還是demo才知道
通過 setFixedSelection(int fixedSelection) 進行設定
通過四個常量屬性進行設定
FIXED_NONE //普通的List
FIXED_TRAIL //靜態
FIXED_LEAD // ...下面兩種都需要用demo看下區別
FIXED_CENTER
setSmoothScrolling(true) //設定這個屬性,應該是在移動時增加動畫效果,預設為false
Using Dialogs 對話方塊
也提供一個Content,可以存放其他的Components //對於是否阻塞執行緒,需要了解一下
Dialog提供了五種不同的型別,預設附加了不同的提示音
ALARM //警告
CONFIRMATION //確認
ERROR //錯誤
INFO //資訊
WARNING //警告提示
當前預設情況下不支援Icon,不過可以自定義Dialog
呼叫dialog的show()方法進行顯示,提供的引數很多,可以選擇合適的過載進行顯示
1:String title 標題
2:Component body 一個單獨的Component
3:String text 用於代替Component body部分
4:Command[] cmds 可以新增Commands
5:int type 設定不同的型別
6:Image icon 新增icon
7:timeout 開啟持續時間,設定成0表示為持續開啟
8:Transition transition 新增動畫
9:String okText 設定Ok按鈕的內容
10:String cancelText 設定cancel的內容
11:int top 設定top所在位置
12:int bottom 設定bottom位置
13:int left 同上
14:int right 同上
15:boolean includeTitle //需要了解下
show方法可以返回三個型別 void,Command,boolean
boolean值在點選ok時為true, cancel時為null
使用非靜態的方法顯示Dialog
dialog.show(90, 90, 10, 10, true);
關閉dialog dispose()
需要先show之前設定timer去關閉dialog
Dialog也可以返回一個Command 區別於點選OK按鈕
Using LayoutManagers 使用佈局管理器
已經的佈局管理器
BorderLayout
BoxLayout
FlowLayout
GridLayout
GroupLayout
BorderLayout 邊框佈局模式(東西南北中)
如下五個區域
Center
East
North
South
West
在新增Components的時候進行設定
addComponent(BorderLayout.CENTER, component) // preferred
或者直接使用字串
addComponent(“Center”, component) // valid but error prone 容易出錯
BoxLayout 盒子佈局
包括了 X_AXIS(橫向) Y_AXIS(豎向)的佈局,並排的方式
BoxLayout boxLayout = new BoxLayout(BoxLayout.X_AXIS);
BoxLayout boxLayout = new BoxLayout(BoxLayout.Y_AXIS);
FlowLayout 流式佈局
這個也是容器預設的佈局方式
橫向佈局,如果長度超出,則自動換行處理
FlowLayout exampleLayout = new FlowLayout();
container.setLayout(exampleLayout);
也可以通過設定建構函式,用於設定佈局起始的位置,比如 Left, Right, or Center
FlowLayout exampleLayout = new FlowLayout(Component.RIGHT);
GridLayout 表格式佈局,可以用於設定九宮圖
可以定製行和列,
GridLayout exampleLayout = new GridLayout(0,2); //2表示每行顯示兩個單元格cell,0不知道是啥
GroupLayout // GUI builders 的方式進行佈局,用於NetBeans中的Swing開發
Using Painters
是一個介面,可以用於繪製一個Components的背景,將繪製在Components限定的範圍內
如果要檢視painter繪製結果,需要設定對應的transparency //需要檢視下
painter可以使用絕對座標的繪圖,所以可以重用在其他元件之上
Painter diagonalPainter = new Painter() {
public void paint(Graphics g, Rectangle rect) {
g.drawLine(rect.getX(),
rect.getY(),
rect.getX() + rect.getSize().getWidth(),
rect.getY() + rect.getSize().getHeight());
}
};
注意檢視這裡獲取位置的方法 x y, size width height
使用時候只要給指定的元件設定Painter即可
myComponent.getStyle().setBgPainter(diagonalPainter);
將會自動應用繪圖
記得顯示的呼叫設定透明度 0-255之間
myButton.getStyle().setBgTransparency(100);
Using the Style. Object 設定樣式物件
The Style. object sets colors, fonts, transparency, margin, padding, images, and borders to define the style. for a given component.
使用component.getStyle(). 獲取該物件,可以在執行時候改變
顏色Style.
Foreground color 前景色,主要指文字顏色
Foreground selection color 當元件獲取焦點時,字型的顏色
Background color 背景色
Background selection color 獲取焦點時候的背景色
這裡顏色使用的是RGB(格式為0x000000),不帶alpha透明色,有而外的透明設定在Style中
Font 字型
Transparency 透明度
setBgTransparency進行設定 範圍是0-255之間
Margin and Padding 外邊距和內間距,與css的盒模型一樣
設定的方式
setPadding(int top, int bottom, int left, int right)
setPadding(int orientation, int gap)
setMargin(int top, int bottom, int left, int right)
setMargin(int orientation, int gap)
// orientation can be Component.TOP, BOTTOM, LEFT or RIGHT
這兩個型別方法的區別在於同時設定一個屬性,還是多個屬性
Images 背景色,預設為不限制背景色 使用bgImage 可以用於進行設定
Borders邊框型別
Style. Listener 樣式事件
myComponent.getStyle().addStyleListener(new StyleListener() {
public void styleChanged(String propertyName, Style. source) {}
}}
Painters也可以用於在Style中設定樣式,用於按照要求繪製背景
mycomponent.getStyle().setBgPainter(myPainter);
Theming 皮膚
refreshTheme()方法用於更新所有的樣式,不過手動修改的樣式元素,並不會被更新
設定樣式屬性需要注意的地方
Button.font – font for all buttons //將會作用到所有Button元件的字型
font- 將會影響到所有沒有定義預設值的組components件
這裡不像css那樣有特殊的單獨樣式設定
所有支援的樣式屬性
fgColor 前景色 16進位制的格式
bgColor 背景色 16進位制的格式,也可以使用縮寫ff
bgSelectionColor 背景選中色 16x
fgSelectionColor 前景選中色 16x
bgImage 背景圖片
transparency 設定背景圖樣式透明色 0-255之間,不過目前對背景圖無效
font 分為Bitmap font和System font 定義的方式為Bitmap{myFontName} 和System{face;style;size}
其中系統字型的引數為
face=FACE_SYSTEM,FACE_PROPORTIONALFACE_PROPORTIONAL
style=STYLE_PLAIN,STYLE_BOLD,STYLE_ITALIC
size=SIZE_MEDIUM,SIZE_SMALL,SIZE_LARGE
例如
System{FACE_SYSTEM;STYLE_PLAIN;SIZE_SMALL}
scaledImage 使用boolean值設定背景圖使用平鋪tiled還是重複scaled 預設為true,重複scaled
margin 外邊距,使用四個引數進行設定,代表top, bottom, left, and right. For example, 1, 2, 3, 4
padding 內邊距,使用與margin類似
更新主題時
使用Resources.open("/javaTheme.res");//進行載入
使用UIManager.getInstance().setThemeProps(r.getTheme(r.getThemeResourceNames()[0]));//進行設定
然後可以使用components.refreshTheme 更新元件的樣式
LookAndFeel DefaultLookAndFeel 似乎是用來定義一些樣式無法修改到的東西,比如滾動條,具體要看API Documention
Resources 資源
LWUIT允許的resource elements的元素包括:
Image Resources //影像資源
Animation Resources //動畫資源
Bitmap Fonts //點陣圖字型
Localization (L10N) //本地化
Themes //主題
可以通過專門的編輯器 Resource Editor 或者Ant tasks來建立Resources
Loading a Resource 讀取一個資原始檔
Resources res = Resources.open(“/myresourceFile.res”);
Image i = res.getImage(“imageName”);
圖片可以儲存在res檔案中,或者直接放置在jar檔案中
讀取jar中圖片的方式
Image image = Image.createImage("/images/duke.png");
image的標籤,應該是res配置的時候,可以有三個屬性
name //名稱,預設為檔名
file //影像檔案所在位置
pack //boolean值 ,預設為false ,用於設定是否為Indexed
影像少於256色的時候,可以使用Index image,有利於節約空間
使用indexed image的注意地方
1:因為需要按照畫素的去操作影像,所以在顯示的時候速度比較慢,不過在現在的手機上並不明顯
2:在執行時轉換indexed image將會比較慢,而且可能會失敗,所以應該在編譯時候進行轉換
3:Indexed image並沒有在res檔案中被壓縮,所以res檔案看起來比較大,不過在jar檔案中卻能被很好的壓縮,而且效果比使用png更好
4:indexed images 建立後將不能被改變,比如getGraphics(),詳情看API
Animation Resources
LWUIT支援從Gif檔案中得到動畫效果,儲存的結構類似image structure
StaticAnimation 用於操作動畫..派生自Image,所以可以直接使用在icon或者其他地方
Fonts 字型
LWUIT支援bitmap fonts and system fonts.
System Font 包括了三個引數
Face //如FACE_SYSTEM, FACE_PROPORTIONAL and FACE_MONOSPACE.
Style //如STYLE_PLAIN, STYLE_ITALIC, STYLE_BOLD.
Size //如SIZE_SMALL, SIZE_MEDIUM, SIZE_LARGE.
在類的內部可以去建立字型引用
Font.createSystemFont(Font.FACE_SYSTEM,Font.STYLE_BOLD,Font.SIZE_MEDIUM);
同時也可以去建立複合型別的字型(加粗和傾斜)
Font.createSystemFont(Font.FACE_SYSTEM,Font.STYLE_BOLD | Font.STYLE_ITALIC,Font.SIZE_MEDIUM);
Bitmap Fonts
三個屬性
name //在res檔案中,用於程式載入
charset //就是包含的字元,預設為24個字母,數字和一些符號
src //字型檔案TrueType所在位置
size //字型大小
bold //是否加粗,預設為false
trueType //預設為true,根據src屬性決定是否生效
antiAliasing //預設為true,如果為false表示別名
logicalName //邏輯名稱,表示不同的字型編碼型別,類似css中使用的4個大區字型
//這裡注意文件中只介紹了使用ant建立Bitmap font,具體還是要檢視API文件
Localization (L10N) 本地化
類似Properties檔案的使用,使用鍵值對的方式儲存在Resources中,只支援使用USASCII嘛的形式
讀取
Hashtable h = bundle.getL10N("localize", "en"); //bundle應該是Resources的例項
UIManager.setResourceBundle(Hashtable) //可以用於替換當前語言
Themes 皮膚
使用ResourceEdit.exe 可以很方便的進行編輯
載入到程式:
UIManager.getInstance().setThemeProps(res.getTheme(“myTheme”));
編輯器建立的預設就是Bitmap font
使用字型需要注意版權問題... 使用編輯器的時候,可以通過設定 Anti-aliasing 達到反鋸齒的能力
Localization 的使用
Using Transitions and Animations
使用過度效果以及動畫
支援的Transition有,可用於form之間進行的轉換
Slide
Fade
Slide Transition
在第一個form中定義
CommonTransitions.createSlide(int type, boolean forward, int speed)
引數
type //定義移動的方向,包括了SLIDE_HORIZONTAL or SLIDE_VERTICAL
forward //用一個boolean值表示,不同方向時,起始位置,比如左到右,不過上到下
speed //用int表示的應該是動畫持續的時間,從而在內部計算執行的速度
使用的例子
myForm.setTransitionOutAnimator(CommonTransitions.createSlide(
CommonTransitions.SLIDE_HORIZONTAL, true, 1000));
Fade Transition 漸變效果 (淡入淡出)
CommonTransitions.createFade(int speed)
引數
speed 同樣表示動畫持續時間,毫秒為單位
例子
themeForm.setTransitionInAnimator(CommonTransitions.createFade(400));
M3G 用於實現3D功能,需要手機的支援 Jsr184
//載入原始碼.注意需要使用jdk1.4進行編譯
呼叫的方式通過 M3G.Callback內部類介面的例項來建立3d動畫物件
class MyCallback implements M3G.Callback {
....
public void paintM3G(Graphics3D g3d) {
g3d.clear(background);
g3d.render(world);
}
...
}
在Components元件上使用的方式為
private M3G.Callback myCallbackInstance = new MyCallback();
public void paint(Graphics g) {
M3G.getInstance().renderM3G(g, true, 0, myCallbackInstance);
// draw some stuff in 2D
...
}
注意這裡的區別Graphics3D 和普通的Graphics物件
M3G目前只支援標準的影像檔案,而不支援IndexedImage and RGBImage
Logging 日誌,可以儲存在RMS或者本地檔案中
也分為了四種級別
DEBUG //預設級別
INFO
WARNING
ERROR
記錄日誌的方式
使用static p(String text) or p(String text,int level) methods.
Log.p(“Finish loading images”)
顯示日誌
Log.showLog();
建立自定義的元件,只要繼承Component物件,然後重寫paint方法即可,類似Canvas的操作
public class MyComponent extends Component {
public void paint(Graphics g) {
g.setColor(0xffffff);
g.fillRect(getX(), getY(), getWidth(), getHeight());
g.setColor(0);
g.drawString("Hello World", getX(), getY());
}}
在頁面上進行使用的時候,就和其他Components一樣 add到容器之上
需要注意的地方
這裡使用的顏色都是不帶alpha的RGB
使用 getX(), getY() 從容器中獲取Components所在的位置,也包括了 getWidth(), getHeight()
控制元件的大小適宜,通過重寫calcPreferredSize()方法
protected Dimension calcPreferredSize() {
Font fnt = Font.getDefaultFont();
int width = fnt.stringWidth(“99999-9999”)
int height = fnt.getHeight();
return new Dimension(width, height);
}
//這裡使用到了獲取字型高度和寬度的方法
事件監聽
和MIDP原有元件一樣,只要重寫對應key事件即可
public void keyReleased(int keyCode) {
if(keyCode >= '0' && keyCode <= '9') {
char c = (char)keyCode;
inputString += c;
repaint();
}
}
Focus 焦點
Components元件中的事件,要求當前元件獲取焦點後才會觸發
setFocusable(true); //使其獲取焦點
使用LookAndFeel繪製
UIManager.getInstance().getLookAndFeel().drawBorder(g, this,getStyle().getFgSelectionColor(), 2);
不是很明白的例子,在Components中
public void paint(Graphics g) {
UIManager.getInstance().getLookAndFeel().setFG(g, this);
Style. style. = getStyle();
g.drawString(inputString, getX() + style.getPadding(LEFT),
getY() + style.getPadding(TOP));
}
不過一些方法不錯 以及常量, 可能第一個方法是初始化元件中引數的狀態
229136
Background 使用Painter來繪製,允許透明translucent與不透明opaque
對自定義元件新增Animating動畫支援
protected void initComponent() {
getComponentForm().registerAnimated(this);
}
不能在建構函式中進行註冊
自定義元件的例子
關鍵方法一
protected Dimension calcPreferredSize() {
Style. style. = getStyle();
Font fnt = style.getFont();
int width = fnt.stringWidth("99999-9999");
int height = fnt.getHeight();
height += style.getPadding(Component.TOP) +
style.getPadding(Component.BOTTOM);
width += style.getPadding(Component.LEFT) +
style.getPadding(Component.RIGHT);
return new Dimension(width, height);
}
用於在視窗變化時候獲取合適的顯示效果
主要使用到的方法
1: Style. style=getStyle(); //獲取當前元件預設樣式物件
2: style.getPadding(LEFT) //獲取左內邊距
3: getX(), getY()獲取x,y引數
4: style.getFont().stringWidth(inputString); 獲取樣式預設字型的寬度,其中inputString為輸入的字串
5: style.getFont().getHeight() 獲取字型的高度
該方法返回的是 new Dimension(width, height); 物件,需要驗證下有何效果
註冊動畫效果
protected void initComponent() {
getComponentForm().registerAnimated(this);
}
修改動畫效果細節
public boolean animate() {
boolean ani = super.animate();
long currentTime = System.currentTimeMillis();
if (drawCursor) {
if ((currentTime - time) > 800) {
time = currentTime;
drawCursor = false;
return true;
}
} else {
if ((currentTime - time) > 200) {
time = currentTime;
drawCursor = true;
return true;
}
}
return ani;
}
影響記憶體使用的因素
計算一個圖片在不同手機上的所佔用的記憶體
長 寬
16 bit: 128 * 128 * 2 = 32,768 一張全屏的圖片所佔用的記憶體
24 bit: 320 * 240 * 4 = 307,200
這裡用的是8的倍數來進行計算, 24位會被當做32位計算
可以使用Indexed images 來代替. 不過缺點是隻支援256色,優點在於更少的記憶體使用率
Display's 的init()方法可以關閉一些佔用記憶體較多的特性
Speed 速度方面
Event Dispatch Thread (EDT) 事件傳送執行緒
Display methods callSerially, callSeriallyAndWait, and invokeAndBlock. 通過這幾個方法進行呼叫特別的執行緒處
理
Light Mode 不是很清楚用途
turning off light mode (after Display.init())
元件關係
Component為所有的視覺化元件的父類,在其之下有四個分支
Container (TabbedPane,Form(Dialog))
TextArea
List (ComboBox)
Label (Button(RadioButton,CheckBox))
Container 可以容納包括容器在內的其他元件.容器內的元件排列由 佈局管理器 負責。
Form. 是頂部有 標題欄(Title Bar)、底部是 選單欄(Menu Bar)的容器,標題欄可以寫入窗體名稱,選單欄可以寫入命令和選單。兩欄之間為內容窗格,該窗格用於放置窗體上的元件。
TabbedPane 允許大量部件組放置在同一個空間。每組部件都有一個與之關聯的選項卡,使用者只能看到與選定選項卡相對應的部件組。預設的選項卡位置在窗格頂部。但是,也可 以將其置於左側、右側或者窗格下部
對話方塊
Dialog 是一個“永遠處於頂層”的元件。預設情況下,對話方塊是情景式的 (modal),在銷燬之前它將阻塞呼叫執行緒
分為五種型別
Alarm
Confirmation
Error
Info
Warning
對話方塊可用於向使用者傳遞執行時資訊,以及收集使用者反饋。不同型別的對話方塊在顯示時將會有相應的提示音。可以向對話方塊中加入圖示,以圖形方式指示其型別
標籤和按鈕
Label 用於顯示影像和文字,但顯示內容不能被選中,也不能和使用者進行互動。可通過許多對齊功能來精確放置標籤和標籤上影像的相關文字。
Button 類擴充套件自 Label 類。按鈕有自己的 狀態,當它被選中和單擊時會生成一個 操作事件。也可以附帶圖片
按鈕的三種狀態如下:
Rollover:這通常相當於按鈕處於選中狀態,獲得焦點。
Pressed:當按鈕被單擊或按下時。
Default:當按鈕既未被選中,也未被單擊時。
Button 類有兩個子類:RadioButton 和 CheckBox。RadioButton 具有 Button 類的全部功能。此外,Radiobutton 可以被新增到 ButtonGroup 中,ButtonGroup 類允許它在組內保持獨佔選定狀態,只能選中一個;
checkBox 核取方塊不能是按鈕組的一部份,其他和HTML等元件中的功能一樣
文字域 TextArea
TextArea 是顯示可編輯文字的元件。可使用本機系統編輯器對其進行編輯,這通常會開啟一個新的螢幕.
List 列表
LWUIT 採用了 模型-檢視-控制器 體系結構
列表的資料結構由 ListModel 介面表示。所以列表不會侷限於特定資料結構,它可以顯示任何實現了該介面物件的資訊。同樣,列表的呈現由實現 ListCellRenderer 的類來完成,因此,開發人員可建立各種型別的外觀。
ComboBox 是一種節省空間的元件,單擊時會有下拉選單顯示。使用者可以從列表中選擇某項。由於ComboBox 擴充套件自 List,您也可以將自定義模型和呈現程式用於組合框,也就是新增自定義的顯示,也就是上面所描述的.
底層資原始檔---影像資源,動畫資源,點陣圖字型,本地化資源包,主題,可以使用資源編輯器進行管理
佈局管理器 ,如下五種
BorderLayout
BoxLayout
FlowLayout
GridLayout
GroupLayout
Style. 樣式設定,基於元件的樣式 (getStyle()),也就是類似HTML中的css設計
顏色
字型
影像
邊距
填充
透明度
當生成某個元件後,將會構建一個預設的 Style. 物件,也可以使用theme主題,生成全域性預設的皮膚主題
Painter 介面允許您在元件背景上繪製圖形,LWUIT 包提供了兩個類來實現此介面 //需要研究下
BackgroundPainter:根據其自身樣式繪製元件背景。
PainterChain:建立一系列產生圖層效果的 Painter,每個 Painter 負責繪製一個元素。
UIManager
LWUIT 的一個重要特性是可從單一位置管理整個應用程式的外觀。UIManager 類可以調整應用程式的視覺方面。該元件可以確保每個應用程式只有一個 UIManager 物件。此類的方法可以在所有元件上應用同樣的外觀,從而動態本地化使用者介面。
LookAndFeel
負責應用程式各種呈現方式的介面。通過重寫此介面的相應方法,可以完全定製應用程式的外觀。LookAndFeel 在 LWUIT 包中的具體實現是 DefaultLookAndFeel,該類控制預設外觀的實際呈現。通過使用 UIManager 的 setLookAndFell方法,可以插入 LookAndFell 的自定義實現。
窗體之間的轉換 -----Effect
LWUIT 庫支援現有窗體與將要顯示的窗體之間的、不同模式的轉換實現。這種轉換的基本實現是通過 Animation 介面、Motion 類、Transition 類、CommonTransitions 類和 Transition3D 類的機制來完成的,可以在 com.sun.lwuit.animations 包中找到它們
動畫的實現過程
Animation 接 口定義了動畫類物件。由於所有元件都實現了 Animation
元件必須在父窗體中對其自身進行註冊,以便獲得動畫回撥,從而執行動畫任務。如要停止這些回撥,元件必須明確取消註冊自身
transition 是一個抽象類,該類表示從一個窗體過渡到另一個窗體時的動畫,兩個具體子類的例子
CommonTransitions:含有實現 Slide 和 Fade 兩種通用轉換型別的方法。
Transition3D:執行轉換(Cube、飛入 和 旋轉),要求裝置支援 3D 圖形 //這裡的3D效果可以考慮刪除,支援不好
Motion 是用來實現運動效果的類。內建的運動型別包括 linear、spline 和 friction。可以通過實現 Motion 的子類來實現其他型別的運動效果
載入主題時,就會從res中讀取主題資料,從而對所有相應的屬性的元件進行更新,不過隻影響未被手動修改的屬性
其他功能
日誌記錄
com.sun.lwuit.util.Log 類提供了將日誌資訊寫入 日誌 檔案(在 root 目錄中建立)的方法,也可以在 Form. 和控制檯上顯示日誌資訊。可以通過 FileConnection API 來使用儲存在日誌檔案中的資訊。
3D功能: 在某些移動裝置上支援可選的硬體加速,以提高其效能。
LWUIT的Button使用以及窗體佈局
佈局
BorderLayout //按照東西南北中的部分方式
BoxLayout-X //從左向右的佈局
BoxLayout-Y //從上向下的佈局
FlowLayout //從左到右,滿時會自動換行
GridLayout //表格式佈局
Demo中還涉及了新增元件的方式,均使用lwuit下的元件
public Form. form. = new Form("LayoutDemo"); //新建一個Form
//BorderLayout,就是把窗體佈局分成東、南、西、北、中這5部分
border = new Button("BorderLayout");
//顧名思義,設定按鈕背景的透明度,範圍0~255,可以用Util的資源編輯器來預先修改
border.getStyle().setBgTransparency(100);
//每個button都需要設計監聽事件
border.addActionListener(this);
對於事件監聽的處理和ActionListener一樣 實現一個介面
這裡通過事件源發出的資訊進行處理
public void actionPerformed(ActionEvent arg0) {
String button_name=((Button)(arg0.getSource())).getText();
if(button_name.equals("BorderLayout"))
{}
進行顯示的時候
Display.init(this);
Resources r;
try {
r = Resources.open("/javaTheme.res");
UIManager.getInstance().setThemeProps(
r.getTheme(r.getThemeResourceNames()[0]));
LayoutDemo l = new LayoutDemo();
l.form.show();
} catch (IOException e) {
e.printStackTrace();
}
進行init,載入資原始檔,顯示元件
動態修改佈局方式
form.setLayout(new BoxLayout(BoxLayout.X_AXIS));
form.setScrollable(true);
addComponents(form);
form.show();
通過繼承Component來獲取繪圖的操作
com.sun.lwuit.Command用於類似原有的Command的實現
新增元件後需要使用
form.addComponent(cdlabel); //進行新增到頁面之上
Radio組 單選組
final RadioButton thirdRB = new RadioButton("Third RadioButton");
form.addComponent(thirdRB);
新增到組
public ButtonGroup group = new ButtonGroup();
group.add(firstRB);
設定樣式
Label cdlabel = new Label("CheckBox:");
cdlabel.getStyle().setMargin(Component.BOTTOM, 0);
事件處理機制
ActionListener用於處理元件的事件
firstCB.addActionListener(listener);
用於註冊元件事件監聽器
ActionListener listener = new ActionListener() {
public void actionPerformed(ActionEvent arg0) {}
} // 匿名介面的形式進行
設定全域性監聽器,需要保證當前類實現了ActionListener介面
form.setCommandListener(this);
public void actionPerformed(ActionEvent arg0) {
//這裡處理Command 以及 判斷ButtonGroup所選中的RadioButton
Command cmd=arg0.getCommand();}
顯示提示框
Dialog.show("Rb_Cb_Lb",str, "OK", null);
Tab元件
TabbedPane tp = new TabbedPane();
//addTab可以為頁面新增控制元件,也可以是Container(相當於容器的控制元件)
tp.addTab("Tab 1", new Label("Welcome to TabbedPane demo!"));
也可以新增新的容器
Container radioButtonsPanel = new Container(new BoxLayout(BoxLayout.Y_AXIS));
tp.addTab("Tab 2", radioButtonsPanel)
同時該容器內也可以繼續新增元件
radioButtonsPanel.addComponent(RightRB);
列表List元件
DefaultListModel myListModel = new DefaultListModel(str_list);
List list = new List(myListModel);
提供一個陣列生成DefaultListModel的例項,也可以傳遞陣列直接給List的建構函式
list.addActionListener(this); 進行事件註冊
新增元件可以有兩個引數 佈局和元件
form.addComponent(BorderLayout.NORTH,button);
對話方塊
Dialog 是一個“永遠處於頂層”的元件。預設情況下,對話方塊是情景式的 (modal),在銷燬之前它將阻塞呼叫執行緒。對話方塊共有以下 5 種型別:
Alarm
Confirmation
Error
Info
Warning
原地址:http://nottiansyf.垃圾廣告.com/blog/377062
可以在startApp方法中定義啟動的過程
public void startApp() {
//init the LWUIT Display
Display.init(this);
//載入資原始檔
try {
Resources r = Resources.open("/myresources.res");
UIManager.getInstance().setThemeProps(r.getTheme(r.getThemeResourceNames()[0]) );
} catch (java.io.IOException e) {
}
簡單的使用一個內建Form進行顯示,而無須使用一個而外的類
Form. f = new Form();
f.setTitle("Hello World");
f.setLayout(new BorderLayout());
f.addComponent("Center", new Label("I am a Label"));
f.show();
注意使用show方法進行顯示
元件介紹
Component 用於顯示到頁面上的基礎部分,可以理解為DisplayObject,也就是元件部分
Container 用於儲存多個Components的容器型別,提供了佈局的能力
Form. 提供title和menus,並且提供一個content放置Components,並且提供了content的滾動能力
addComponent,用於新增Components到Content中
提供的一些方法和使用方式
Form. mainForm. = new Form("Form. Title"); //宣告一個帶標題的Form.
mainForm.setLayout(new BorderLayout()); //設定佈局管理器
mainForm.addComponent(BorderLayout.CENTER, new Label(“Hello,World”)); //新增Components元件,
mainForm.setTransitionOutAnimator(CommonTransitions.createFade(400)); //設定動畫
mainForm.addCommand(new Command("Run", 2)); //新增選單命令
mainForm.show(); //顯示Form.
一些技巧
1:可以使用帶引數的建構函式,設定標題.也可以不設定標題的建構函式
2:addComponent() 方法提供兩個過載,區別在於是否指定佈局位置
3:Transition動畫用於在forms之間進行切換時候觸發
4:Form通過Commands新增選單,根據新增順序排序顯示,其他使用與普通的J2me一樣
Label: 可以同時顯示圖片和文字,設定align佈局,可以通過繼承Label實現擴充套件,如果更復雜,可以使用Button
提供的一些方法和使用方式
Label textLabel = new Label("I am a Label"); //建立一個單行文字
Image icon = Image.createImage("/images/duke.png");
Label imageLabel = new Label(icon); //建立一個帶圖片的Label
setTextPosition(int alignment); //設定佈局方式,CENTER, LEFT, RIGHT,LEFT,TOP, BOTTOM, LEFT, RIGHT,
Button 可以用於觸發一個點選的事件Action,使用一個ActionListeners 進行監聽
final Button button = new Button("Old Text");
button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
button.setText("New Text");
}}); //使用匿名的ActionListener介面實現類進行監聽
Button繼承Label, 所以可以設定不同圖文混編的風格,並且提供了三種狀態ollover, pressed, and the default
state
RadioButton 單選按鈕,繼承自Button
RadioButton radioButton = new RadioButton(“Radio Button”);
同樣,也會觸發action
ButtonGroup 用於保證RadioButton只能選中一項
RadioButton rb1 = new RadioButton("First RadioButton in Group 1");
RadioButton rb2 = new RadioButton("Second RadioButton in Group 1");
ButtonGroup group1 = new ButtonGroup();
group1.add(rb1);
group1.add(rb2);
exampleContainer.addComponent(rb1);
exampleContainer.addComponent(rb2);
這裡需要注意,只需要新增addComponent(RadioButton) 到容器中,不需要新增ButtonGroup,只用於後臺管理
CheckBox 多選框,不需要新增到group中,同樣也觸發事件
final CheckBox checkBox = new CheckBox(“Check Box”);
通過checkBox.isSelected() 判斷是否被選中
ComboBox 列表,只允許一個被選中,多用於空間有限時候提供多選項的單選功能
建立需要一個陣列作為資料來源
String[] content = { "Red", "Blue", "Green", "Yellow" };
ComboBox comboBox = new ComboBox(content); //建立一個Combox,在這個建構函式中也是使用List實現
comboBox.setListCellRenderer(new checkBoxRenderer()); //設定renderer 渲染器
也可以使用addActionListener註冊事件
通過實現不同的renderer介面可以給元件提供不同的顯示效果 implements ListCellRenderer
TextArea
例子
TextArea textArea = new TextArea(5, 20, TextArea.NUMERIC);
textArea.setEditable(false);
建構函式的前兩個引數為 總行數和單行長度,第三個引數用於傳遞到本地文字輸入,用於指定限制的型別
可以使用TextArea的常量 ANY,EMAILADDR, NUMERIC, PHONENUMBER, URL, or DECIMAL,PASSWORD, UNEDITABLE, SENSITIVE,NON_PREDICTIVE, INITIAL_CAPS_SENTENCE, INITIAL_CAPS_WORD.也可以使用 | 設定複合約束
預設下可編輯
TabbedPane 通過類似Tab的選項卡方式並排放置一組容器,容器的tab標籤可以使用圖文混編方式
可以使用addTab or insertTab methods 方法新增容器
removeTabAt(int index) 移除容器
tab的索引由0開始
tab標籤可以有四種不同的放置方法 LEFT, RIGHT, TOP or BOTTOM using the setTabPlacement method.
TabbedPane tabbedPane = new TabbedPane(TabbedPane.TOP);
tabbedPane.addTab("Tab 1", new Label("I am a TabbedPane!"));
tabbedPane.addTab("Tab 2", new Label("Tab number 2"));
建構函式使用一個Tab標籤佈局的常量作為引數
addTab,第一個為tab標籤名,第二個引數為直接放置到容器中的內容
Using Lists
List,使用Swing的 MVC模式進行建立
rendered using a ListCellRenderer and are extracted using the ListModel.
使用ListCellRenderer 作為顯示的V
使用ListModel. 作為資料來源M
其他部分為C進行操作
建立List 有四個建構函式
List()
List(ListModel model) //直接例項化ListModel
List(Object[] items) //Array陣列
List(Vector items) //Vector集合
ListModel 也可以分為自定ListModel的實現,以及DefaultListModel
DefaultListModel的使用
String[] items = { "Red", "Blue", "Green", "Yellow" };
DefaultListModel myListModel = new DefaultListModel(items); //使用Array作為資料來源
ListCellRenderer 渲染器
同樣也可以自定ListCellRenderer的實現,以及DefaultListCellRenderer
自定義的時候,可以通過繼承Libel,來節約開發的速度 ,主要實現兩個方法
public class MyYesNoRenderer extends Label implements ListCellRenderer{
public Component getListCellRendererComponent(List list,
Object value, int index, boolean isSelected) {
((Boolean)value).booleanValue() 來獲取單項的值
}
public Component getListFocusComponent(List list) {
Label label = new label("");
label.getStyle().setBgTransparency(100);
return label;
}}
DefaultListCellRenderer,預設也是使用Label and the ListCellRenderer interface.
實現兩個方法,大體和上面相同
getListCellRendererComponent()
getListFocusComponent() //選中風格,可以通過修改透明度來表現
新增或移除item
新增的方法有兩種,建立一個ListModel,然後add到list中,重置一個List 使用setModel(ListModel model). 方法
移除的方法有removeItem(int index) or removeAll() methods.
myListModel.addItem(“New Item”); //新增Item
myListModel.removeItem(index); //刪除Item
myListModel.removeAll(); //刪除所有Item
List 事件 提供了兩種事件 ActionEvent and SelectionsListener
addFocusListener(FocusListener l) 區別於常用的Action
SelectionListener 應該會更有用一些
Fixed Selection Feature 應該是隻有一行的List,不彈出選單的模式 //具體還是demo才知道
通過 setFixedSelection(int fixedSelection) 進行設定
通過四個常量屬性進行設定
FIXED_NONE //普通的List
FIXED_TRAIL //靜態
FIXED_LEAD // ...下面兩種都需要用demo看下區別
FIXED_CENTER
setSmoothScrolling(true) //設定這個屬性,應該是在移動時增加動畫效果,預設為false
Using Dialogs 對話方塊
也提供一個Content,可以存放其他的Components //對於是否阻塞執行緒,需要了解一下
Dialog提供了五種不同的型別,預設附加了不同的提示音
ALARM //警告
CONFIRMATION //確認
ERROR //錯誤
INFO //資訊
WARNING //警告提示
當前預設情況下不支援Icon,不過可以自定義Dialog
呼叫dialog的show()方法進行顯示,提供的引數很多,可以選擇合適的過載進行顯示
1:String title 標題
2:Component body 一個單獨的Component
3:String text 用於代替Component body部分
4:Command[] cmds 可以新增Commands
5:int type 設定不同的型別
6:Image icon 新增icon
7:timeout 開啟持續時間,設定成0表示為持續開啟
8:Transition transition 新增動畫
9:String okText 設定Ok按鈕的內容
10:String cancelText 設定cancel的內容
11:int top 設定top所在位置
12:int bottom 設定bottom位置
13:int left 同上
14:int right 同上
15:boolean includeTitle //需要了解下
show方法可以返回三個型別 void,Command,boolean
boolean值在點選ok時為true, cancel時為null
使用非靜態的方法顯示Dialog
dialog.show(90, 90, 10, 10, true);
關閉dialog dispose()
需要先show之前設定timer去關閉dialog
Dialog也可以返回一個Command 區別於點選OK按鈕
Using LayoutManagers 使用佈局管理器
已經的佈局管理器
BorderLayout
BoxLayout
FlowLayout
GridLayout
GroupLayout
BorderLayout 邊框佈局模式(東西南北中)
如下五個區域
Center
East
North
South
West
在新增Components的時候進行設定
addComponent(BorderLayout.CENTER, component) // preferred
或者直接使用字串
addComponent(“Center”, component) // valid but error prone 容易出錯
BoxLayout 盒子佈局
包括了 X_AXIS(橫向) Y_AXIS(豎向)的佈局,並排的方式
BoxLayout boxLayout = new BoxLayout(BoxLayout.X_AXIS);
BoxLayout boxLayout = new BoxLayout(BoxLayout.Y_AXIS);
FlowLayout 流式佈局
這個也是容器預設的佈局方式
橫向佈局,如果長度超出,則自動換行處理
FlowLayout exampleLayout = new FlowLayout();
container.setLayout(exampleLayout);
也可以通過設定建構函式,用於設定佈局起始的位置,比如 Left, Right, or Center
FlowLayout exampleLayout = new FlowLayout(Component.RIGHT);
GridLayout 表格式佈局,可以用於設定九宮圖
可以定製行和列,
GridLayout exampleLayout = new GridLayout(0,2); //2表示每行顯示兩個單元格cell,0不知道是啥
GroupLayout // GUI builders 的方式進行佈局,用於NetBeans中的Swing開發
Using Painters
是一個介面,可以用於繪製一個Components的背景,將繪製在Components限定的範圍內
如果要檢視painter繪製結果,需要設定對應的transparency //需要檢視下
painter可以使用絕對座標的繪圖,所以可以重用在其他元件之上
Painter diagonalPainter = new Painter() {
public void paint(Graphics g, Rectangle rect) {
g.drawLine(rect.getX(),
rect.getY(),
rect.getX() + rect.getSize().getWidth(),
rect.getY() + rect.getSize().getHeight());
}
};
注意檢視這裡獲取位置的方法 x y, size width height
使用時候只要給指定的元件設定Painter即可
myComponent.getStyle().setBgPainter(diagonalPainter);
將會自動應用繪圖
記得顯示的呼叫設定透明度 0-255之間
myButton.getStyle().setBgTransparency(100);
Using the Style. Object 設定樣式物件
The Style. object sets colors, fonts, transparency, margin, padding, images, and borders to define the style. for a given component.
使用component.getStyle(). 獲取該物件,可以在執行時候改變
顏色Style.
Foreground color 前景色,主要指文字顏色
Foreground selection color 當元件獲取焦點時,字型的顏色
Background color 背景色
Background selection color 獲取焦點時候的背景色
這裡顏色使用的是RGB(格式為0x000000),不帶alpha透明色,有而外的透明設定在Style中
Font 字型
Transparency 透明度
setBgTransparency進行設定 範圍是0-255之間
Margin and Padding 外邊距和內間距,與css的盒模型一樣
設定的方式
setPadding(int top, int bottom, int left, int right)
setPadding(int orientation, int gap)
setMargin(int top, int bottom, int left, int right)
setMargin(int orientation, int gap)
// orientation can be Component.TOP, BOTTOM, LEFT or RIGHT
這兩個型別方法的區別在於同時設定一個屬性,還是多個屬性
Images 背景色,預設為不限制背景色 使用bgImage 可以用於進行設定
Borders邊框型別
Style. Listener 樣式事件
myComponent.getStyle().addStyleListener(new StyleListener() {
public void styleChanged(String propertyName, Style. source) {}
}}
Painters也可以用於在Style中設定樣式,用於按照要求繪製背景
mycomponent.getStyle().setBgPainter(myPainter);
Theming 皮膚
refreshTheme()方法用於更新所有的樣式,不過手動修改的樣式元素,並不會被更新
設定樣式屬性需要注意的地方
Button.font – font for all buttons //將會作用到所有Button元件的字型
font- 將會影響到所有沒有定義預設值的組components件
這裡不像css那樣有特殊的單獨樣式設定
所有支援的樣式屬性
fgColor 前景色 16進位制的格式
bgColor 背景色 16進位制的格式,也可以使用縮寫ff
bgSelectionColor 背景選中色 16x
fgSelectionColor 前景選中色 16x
bgImage 背景圖片
transparency 設定背景圖樣式透明色 0-255之間,不過目前對背景圖無效
font 分為Bitmap font和System font 定義的方式為Bitmap{myFontName} 和System{face;style;size}
其中系統字型的引數為
face=FACE_SYSTEM,FACE_PROPORTIONALFACE_PROPORTIONAL
style=STYLE_PLAIN,STYLE_BOLD,STYLE_ITALIC
size=SIZE_MEDIUM,SIZE_SMALL,SIZE_LARGE
例如
System{FACE_SYSTEM;STYLE_PLAIN;SIZE_SMALL}
scaledImage 使用boolean值設定背景圖使用平鋪tiled還是重複scaled 預設為true,重複scaled
margin 外邊距,使用四個引數進行設定,代表top, bottom, left, and right. For example, 1, 2, 3, 4
padding 內邊距,使用與margin類似
更新主題時
使用Resources.open("/javaTheme.res");//進行載入
使用UIManager.getInstance().setThemeProps(r.getTheme(r.getThemeResourceNames()[0]));//進行設定
然後可以使用components.refreshTheme 更新元件的樣式
LookAndFeel DefaultLookAndFeel 似乎是用來定義一些樣式無法修改到的東西,比如滾動條,具體要看API Documention
Resources 資源
LWUIT允許的resource elements的元素包括:
Image Resources //影像資源
Animation Resources //動畫資源
Bitmap Fonts //點陣圖字型
Localization (L10N) //本地化
Themes //主題
可以通過專門的編輯器 Resource Editor 或者Ant tasks來建立Resources
Loading a Resource 讀取一個資原始檔
Resources res = Resources.open(“/myresourceFile.res”);
Image i = res.getImage(“imageName”);
圖片可以儲存在res檔案中,或者直接放置在jar檔案中
讀取jar中圖片的方式
Image image = Image.createImage("/images/duke.png");
image的標籤,應該是res配置的時候,可以有三個屬性
name //名稱,預設為檔名
file //影像檔案所在位置
pack //boolean值 ,預設為false ,用於設定是否為Indexed
影像少於256色的時候,可以使用Index image,有利於節約空間
使用indexed image的注意地方
1:因為需要按照畫素的去操作影像,所以在顯示的時候速度比較慢,不過在現在的手機上並不明顯
2:在執行時轉換indexed image將會比較慢,而且可能會失敗,所以應該在編譯時候進行轉換
3:Indexed image並沒有在res檔案中被壓縮,所以res檔案看起來比較大,不過在jar檔案中卻能被很好的壓縮,而且效果比使用png更好
4:indexed images 建立後將不能被改變,比如getGraphics(),詳情看API
Animation Resources
LWUIT支援從Gif檔案中得到動畫效果,儲存的結構類似image structure
StaticAnimation 用於操作動畫..派生自Image,所以可以直接使用在icon或者其他地方
Fonts 字型
LWUIT支援bitmap fonts and system fonts.
System Font 包括了三個引數
Face //如FACE_SYSTEM, FACE_PROPORTIONAL and FACE_MONOSPACE.
Style //如STYLE_PLAIN, STYLE_ITALIC, STYLE_BOLD.
Size //如SIZE_SMALL, SIZE_MEDIUM, SIZE_LARGE.
在類的內部可以去建立字型引用
Font.createSystemFont(Font.FACE_SYSTEM,Font.STYLE_BOLD,Font.SIZE_MEDIUM);
同時也可以去建立複合型別的字型(加粗和傾斜)
Font.createSystemFont(Font.FACE_SYSTEM,Font.STYLE_BOLD | Font.STYLE_ITALIC,Font.SIZE_MEDIUM);
Bitmap Fonts
三個屬性
name //在res檔案中,用於程式載入
charset //就是包含的字元,預設為24個字母,數字和一些符號
src //字型檔案TrueType所在位置
size //字型大小
bold //是否加粗,預設為false
trueType //預設為true,根據src屬性決定是否生效
antiAliasing //預設為true,如果為false表示別名
logicalName //邏輯名稱,表示不同的字型編碼型別,類似css中使用的4個大區字型
//這裡注意文件中只介紹了使用ant建立Bitmap font,具體還是要檢視API文件
Localization (L10N) 本地化
類似Properties檔案的使用,使用鍵值對的方式儲存在Resources中,只支援使用USASCII嘛的形式
讀取
Hashtable h = bundle.getL10N("localize", "en"); //bundle應該是Resources的例項
UIManager.setResourceBundle(Hashtable) //可以用於替換當前語言
Themes 皮膚
使用ResourceEdit.exe 可以很方便的進行編輯
載入到程式:
UIManager.getInstance().setThemeProps(res.getTheme(“myTheme”));
編輯器建立的預設就是Bitmap font
使用字型需要注意版權問題... 使用編輯器的時候,可以通過設定 Anti-aliasing 達到反鋸齒的能力
Localization 的使用
Using Transitions and Animations
使用過度效果以及動畫
支援的Transition有,可用於form之間進行的轉換
Slide
Fade
Slide Transition
在第一個form中定義
CommonTransitions.createSlide(int type, boolean forward, int speed)
引數
type //定義移動的方向,包括了SLIDE_HORIZONTAL or SLIDE_VERTICAL
forward //用一個boolean值表示,不同方向時,起始位置,比如左到右,不過上到下
speed //用int表示的應該是動畫持續的時間,從而在內部計算執行的速度
使用的例子
myForm.setTransitionOutAnimator(CommonTransitions.createSlide(
CommonTransitions.SLIDE_HORIZONTAL, true, 1000));
Fade Transition 漸變效果 (淡入淡出)
CommonTransitions.createFade(int speed)
引數
speed 同樣表示動畫持續時間,毫秒為單位
例子
themeForm.setTransitionInAnimator(CommonTransitions.createFade(400));
M3G 用於實現3D功能,需要手機的支援 Jsr184
//載入原始碼.注意需要使用jdk1.4進行編譯
呼叫的方式通過 M3G.Callback內部類介面的例項來建立3d動畫物件
class MyCallback implements M3G.Callback {
....
public void paintM3G(Graphics3D g3d) {
g3d.clear(background);
g3d.render(world);
}
...
}
在Components元件上使用的方式為
private M3G.Callback myCallbackInstance = new MyCallback();
public void paint(Graphics g) {
M3G.getInstance().renderM3G(g, true, 0, myCallbackInstance);
// draw some stuff in 2D
...
}
注意這裡的區別Graphics3D 和普通的Graphics物件
M3G目前只支援標準的影像檔案,而不支援IndexedImage and RGBImage
Logging 日誌,可以儲存在RMS或者本地檔案中
也分為了四種級別
DEBUG //預設級別
INFO
WARNING
ERROR
記錄日誌的方式
使用static p(String text) or p(String text,int level) methods.
Log.p(“Finish loading images”)
顯示日誌
Log.showLog();
建立自定義的元件,只要繼承Component物件,然後重寫paint方法即可,類似Canvas的操作
public class MyComponent extends Component {
public void paint(Graphics g) {
g.setColor(0xffffff);
g.fillRect(getX(), getY(), getWidth(), getHeight());
g.setColor(0);
g.drawString("Hello World", getX(), getY());
}}
在頁面上進行使用的時候,就和其他Components一樣 add到容器之上
需要注意的地方
這裡使用的顏色都是不帶alpha的RGB
使用 getX(), getY() 從容器中獲取Components所在的位置,也包括了 getWidth(), getHeight()
控制元件的大小適宜,通過重寫calcPreferredSize()方法
protected Dimension calcPreferredSize() {
Font fnt = Font.getDefaultFont();
int width = fnt.stringWidth(“99999-9999”)
int height = fnt.getHeight();
return new Dimension(width, height);
}
//這裡使用到了獲取字型高度和寬度的方法
事件監聽
和MIDP原有元件一樣,只要重寫對應key事件即可
public void keyReleased(int keyCode) {
if(keyCode >= '0' && keyCode <= '9') {
char c = (char)keyCode;
inputString += c;
repaint();
}
}
Focus 焦點
Components元件中的事件,要求當前元件獲取焦點後才會觸發
setFocusable(true); //使其獲取焦點
使用LookAndFeel繪製
UIManager.getInstance().getLookAndFeel().drawBorder(g, this,getStyle().getFgSelectionColor(), 2);
不是很明白的例子,在Components中
public void paint(Graphics g) {
UIManager.getInstance().getLookAndFeel().setFG(g, this);
Style. style. = getStyle();
g.drawString(inputString, getX() + style.getPadding(LEFT),
getY() + style.getPadding(TOP));
}
不過一些方法不錯 以及常量, 可能第一個方法是初始化元件中引數的狀態
229136
Background 使用Painter來繪製,允許透明translucent與不透明opaque
對自定義元件新增Animating動畫支援
protected void initComponent() {
getComponentForm().registerAnimated(this);
}
不能在建構函式中進行註冊
自定義元件的例子
關鍵方法一
protected Dimension calcPreferredSize() {
Style. style. = getStyle();
Font fnt = style.getFont();
int width = fnt.stringWidth("99999-9999");
int height = fnt.getHeight();
height += style.getPadding(Component.TOP) +
style.getPadding(Component.BOTTOM);
width += style.getPadding(Component.LEFT) +
style.getPadding(Component.RIGHT);
return new Dimension(width, height);
}
用於在視窗變化時候獲取合適的顯示效果
主要使用到的方法
1: Style. style=getStyle(); //獲取當前元件預設樣式物件
2: style.getPadding(LEFT) //獲取左內邊距
3: getX(), getY()獲取x,y引數
4: style.getFont().stringWidth(inputString); 獲取樣式預設字型的寬度,其中inputString為輸入的字串
5: style.getFont().getHeight() 獲取字型的高度
該方法返回的是 new Dimension(width, height); 物件,需要驗證下有何效果
註冊動畫效果
protected void initComponent() {
getComponentForm().registerAnimated(this);
}
修改動畫效果細節
public boolean animate() {
boolean ani = super.animate();
long currentTime = System.currentTimeMillis();
if (drawCursor) {
if ((currentTime - time) > 800) {
time = currentTime;
drawCursor = false;
return true;
}
} else {
if ((currentTime - time) > 200) {
time = currentTime;
drawCursor = true;
return true;
}
}
return ani;
}
影響記憶體使用的因素
計算一個圖片在不同手機上的所佔用的記憶體
長 寬
16 bit: 128 * 128 * 2 = 32,768 一張全屏的圖片所佔用的記憶體
24 bit: 320 * 240 * 4 = 307,200
這裡用的是8的倍數來進行計算, 24位會被當做32位計算
可以使用Indexed images 來代替. 不過缺點是隻支援256色,優點在於更少的記憶體使用率
Display's 的init()方法可以關閉一些佔用記憶體較多的特性
Speed 速度方面
Event Dispatch Thread (EDT) 事件傳送執行緒
Display methods callSerially, callSeriallyAndWait, and invokeAndBlock. 通過這幾個方法進行呼叫特別的執行緒處
理
Light Mode 不是很清楚用途
turning off light mode (after Display.init())
元件關係
Component為所有的視覺化元件的父類,在其之下有四個分支
Container (TabbedPane,Form(Dialog))
TextArea
List (ComboBox)
Label (Button(RadioButton,CheckBox))
Container 可以容納包括容器在內的其他元件.容器內的元件排列由 佈局管理器 負責。
Form. 是頂部有 標題欄(Title Bar)、底部是 選單欄(Menu Bar)的容器,標題欄可以寫入窗體名稱,選單欄可以寫入命令和選單。兩欄之間為內容窗格,該窗格用於放置窗體上的元件。
TabbedPane 允許大量部件組放置在同一個空間。每組部件都有一個與之關聯的選項卡,使用者只能看到與選定選項卡相對應的部件組。預設的選項卡位置在窗格頂部。但是,也可 以將其置於左側、右側或者窗格下部
對話方塊
Dialog 是一個“永遠處於頂層”的元件。預設情況下,對話方塊是情景式的 (modal),在銷燬之前它將阻塞呼叫執行緒
分為五種型別
Alarm
Confirmation
Error
Info
Warning
對話方塊可用於向使用者傳遞執行時資訊,以及收集使用者反饋。不同型別的對話方塊在顯示時將會有相應的提示音。可以向對話方塊中加入圖示,以圖形方式指示其型別
標籤和按鈕
Label 用於顯示影像和文字,但顯示內容不能被選中,也不能和使用者進行互動。可通過許多對齊功能來精確放置標籤和標籤上影像的相關文字。
Button 類擴充套件自 Label 類。按鈕有自己的 狀態,當它被選中和單擊時會生成一個 操作事件。也可以附帶圖片
按鈕的三種狀態如下:
Rollover:這通常相當於按鈕處於選中狀態,獲得焦點。
Pressed:當按鈕被單擊或按下時。
Default:當按鈕既未被選中,也未被單擊時。
Button 類有兩個子類:RadioButton 和 CheckBox。RadioButton 具有 Button 類的全部功能。此外,Radiobutton 可以被新增到 ButtonGroup 中,ButtonGroup 類允許它在組內保持獨佔選定狀態,只能選中一個;
checkBox 核取方塊不能是按鈕組的一部份,其他和HTML等元件中的功能一樣
文字域 TextArea
TextArea 是顯示可編輯文字的元件。可使用本機系統編輯器對其進行編輯,這通常會開啟一個新的螢幕.
List 列表
LWUIT 採用了 模型-檢視-控制器 體系結構
列表的資料結構由 ListModel 介面表示。所以列表不會侷限於特定資料結構,它可以顯示任何實現了該介面物件的資訊。同樣,列表的呈現由實現 ListCellRenderer 的類來完成,因此,開發人員可建立各種型別的外觀。
ComboBox 是一種節省空間的元件,單擊時會有下拉選單顯示。使用者可以從列表中選擇某項。由於ComboBox 擴充套件自 List,您也可以將自定義模型和呈現程式用於組合框,也就是新增自定義的顯示,也就是上面所描述的.
底層資原始檔---影像資源,動畫資源,點陣圖字型,本地化資源包,主題,可以使用資源編輯器進行管理
佈局管理器 ,如下五種
BorderLayout
BoxLayout
FlowLayout
GridLayout
GroupLayout
Style. 樣式設定,基於元件的樣式 (getStyle()),也就是類似HTML中的css設計
顏色
字型
影像
邊距
填充
透明度
當生成某個元件後,將會構建一個預設的 Style. 物件,也可以使用theme主題,生成全域性預設的皮膚主題
Painter 介面允許您在元件背景上繪製圖形,LWUIT 包提供了兩個類來實現此介面 //需要研究下
BackgroundPainter:根據其自身樣式繪製元件背景。
PainterChain:建立一系列產生圖層效果的 Painter,每個 Painter 負責繪製一個元素。
UIManager
LWUIT 的一個重要特性是可從單一位置管理整個應用程式的外觀。UIManager 類可以調整應用程式的視覺方面。該元件可以確保每個應用程式只有一個 UIManager 物件。此類的方法可以在所有元件上應用同樣的外觀,從而動態本地化使用者介面。
LookAndFeel
負責應用程式各種呈現方式的介面。通過重寫此介面的相應方法,可以完全定製應用程式的外觀。LookAndFeel 在 LWUIT 包中的具體實現是 DefaultLookAndFeel,該類控制預設外觀的實際呈現。通過使用 UIManager 的 setLookAndFell方法,可以插入 LookAndFell 的自定義實現。
窗體之間的轉換 -----Effect
LWUIT 庫支援現有窗體與將要顯示的窗體之間的、不同模式的轉換實現。這種轉換的基本實現是通過 Animation 介面、Motion 類、Transition 類、CommonTransitions 類和 Transition3D 類的機制來完成的,可以在 com.sun.lwuit.animations 包中找到它們
動畫的實現過程
Animation 接 口定義了動畫類物件。由於所有元件都實現了 Animation
元件必須在父窗體中對其自身進行註冊,以便獲得動畫回撥,從而執行動畫任務。如要停止這些回撥,元件必須明確取消註冊自身
transition 是一個抽象類,該類表示從一個窗體過渡到另一個窗體時的動畫,兩個具體子類的例子
CommonTransitions:含有實現 Slide 和 Fade 兩種通用轉換型別的方法。
Transition3D:執行轉換(Cube、飛入 和 旋轉),要求裝置支援 3D 圖形 //這裡的3D效果可以考慮刪除,支援不好
Motion 是用來實現運動效果的類。內建的運動型別包括 linear、spline 和 friction。可以通過實現 Motion 的子類來實現其他型別的運動效果
載入主題時,就會從res中讀取主題資料,從而對所有相應的屬性的元件進行更新,不過隻影響未被手動修改的屬性
其他功能
日誌記錄
com.sun.lwuit.util.Log 類提供了將日誌資訊寫入 日誌 檔案(在 root 目錄中建立)的方法,也可以在 Form. 和控制檯上顯示日誌資訊。可以通過 FileConnection API 來使用儲存在日誌檔案中的資訊。
3D功能: 在某些移動裝置上支援可選的硬體加速,以提高其效能。
LWUIT的Button使用以及窗體佈局
佈局
BorderLayout //按照東西南北中的部分方式
BoxLayout-X //從左向右的佈局
BoxLayout-Y //從上向下的佈局
FlowLayout //從左到右,滿時會自動換行
GridLayout //表格式佈局
Demo中還涉及了新增元件的方式,均使用lwuit下的元件
public Form. form. = new Form("LayoutDemo"); //新建一個Form
//BorderLayout,就是把窗體佈局分成東、南、西、北、中這5部分
border = new Button("BorderLayout");
//顧名思義,設定按鈕背景的透明度,範圍0~255,可以用Util的資源編輯器來預先修改
border.getStyle().setBgTransparency(100);
//每個button都需要設計監聽事件
border.addActionListener(this);
對於事件監聽的處理和ActionListener一樣 實現一個介面
這裡通過事件源發出的資訊進行處理
public void actionPerformed(ActionEvent arg0) {
String button_name=((Button)(arg0.getSource())).getText();
if(button_name.equals("BorderLayout"))
{}
進行顯示的時候
Display.init(this);
Resources r;
try {
r = Resources.open("/javaTheme.res");
UIManager.getInstance().setThemeProps(
r.getTheme(r.getThemeResourceNames()[0]));
LayoutDemo l = new LayoutDemo();
l.form.show();
} catch (IOException e) {
e.printStackTrace();
}
進行init,載入資原始檔,顯示元件
動態修改佈局方式
form.setLayout(new BoxLayout(BoxLayout.X_AXIS));
form.setScrollable(true);
addComponents(form);
form.show();
通過繼承Component來獲取繪圖的操作
com.sun.lwuit.Command用於類似原有的Command的實現
新增元件後需要使用
form.addComponent(cdlabel); //進行新增到頁面之上
Radio組 單選組
final RadioButton thirdRB = new RadioButton("Third RadioButton");
form.addComponent(thirdRB);
新增到組
public ButtonGroup group = new ButtonGroup();
group.add(firstRB);
設定樣式
Label cdlabel = new Label("CheckBox:");
cdlabel.getStyle().setMargin(Component.BOTTOM, 0);
事件處理機制
ActionListener用於處理元件的事件
firstCB.addActionListener(listener);
用於註冊元件事件監聽器
ActionListener listener = new ActionListener() {
public void actionPerformed(ActionEvent arg0) {}
} // 匿名介面的形式進行
設定全域性監聽器,需要保證當前類實現了ActionListener介面
form.setCommandListener(this);
public void actionPerformed(ActionEvent arg0) {
//這裡處理Command 以及 判斷ButtonGroup所選中的RadioButton
Command cmd=arg0.getCommand();}
顯示提示框
Dialog.show("Rb_Cb_Lb",str, "OK", null);
Tab元件
TabbedPane tp = new TabbedPane();
//addTab可以為頁面新增控制元件,也可以是Container(相當於容器的控制元件)
tp.addTab("Tab 1", new Label("Welcome to TabbedPane demo!"));
也可以新增新的容器
Container radioButtonsPanel = new Container(new BoxLayout(BoxLayout.Y_AXIS));
tp.addTab("Tab 2", radioButtonsPanel)
同時該容器內也可以繼續新增元件
radioButtonsPanel.addComponent(RightRB);
列表List元件
DefaultListModel myListModel = new DefaultListModel(str_list);
List list = new List(myListModel);
提供一個陣列生成DefaultListModel的例項,也可以傳遞陣列直接給List的建構函式
list.addActionListener(this); 進行事件註冊
新增元件可以有兩個引數 佈局和元件
form.addComponent(BorderLayout.NORTH,button);
對話方塊
Dialog 是一個“永遠處於頂層”的元件。預設情況下,對話方塊是情景式的 (modal),在銷燬之前它將阻塞呼叫執行緒。對話方塊共有以下 5 種型別:
Alarm
Confirmation
Error
Info
Warning
原地址:http://nottiansyf.垃圾廣告.com/blog/377062
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/21359667/viewspace-620863/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- iOS Xcode全面剖析iOSXCode
- 全面剖析 Redux 原始碼Redux原始碼
- LWUIT 1.3終於釋出了!UI
- Android通知Notification全面剖析Android
- MySQL複製模式的全面剖析MySql模式
- LINQ模型對比全面剖析模型
- 全面通透深入剖析工廠方法模式模式
- 全面剖析Windows磁碟掃描功能(轉)Windows
- 移動app測試現狀全面剖析APP
- 《WCF全面剖析》-章節內容簡介
- 全面剖析小紅書種草/引流筆記玩法筆記
- 全面剖析Android訊息機制原始碼Android原始碼
- 從原始碼全面剖析 React 元件更新機制原始碼React元件
- 全面剖析Oracle資料庫中的分割槽功能Oracle資料庫
- 全面剖析C#介面程式設計之定義介面C#程式設計
- memcached全面剖析--2.理解memcached的記憶體儲存記憶體
- ASP.NET 2.0傳送電子郵件全面剖析之二ASP.NET
- SpringCloud元件 & 原始碼剖析:Eureka服務註冊方式流程全面分析SpringGCCloud元件原始碼
- 全面剖析《自己動手寫作業系統》的pmtest1.asm作業系統ASM
- Unity提交IPO申請,我們對它進行了一次全面剖析Unity
- 剖析非同質化代幣ERC721-全面解析ERC721標準
- 資料剖析更靈活、更快捷,火山引擎 DataLeap 動態探查全面升級
- 社群智慧養老資訊化如何落地,全面剖析其真實性與可行性
- 剖析 CopyOnWriteArrayList
- viewports剖析View
- Java集合原始碼剖析——ArrayList原始碼剖析Java原始碼
- 【Java集合原始碼剖析】ArrayList原始碼剖析Java原始碼
- 【Java集合原始碼剖析】Vector原始碼剖析Java原始碼
- 【Java集合原始碼剖析】HashMap原始碼剖析Java原始碼HashMap
- 【Java集合原始碼剖析】Hashtable原始碼剖析Java原始碼
- 【Java集合原始碼剖析】TreeMap原始碼剖析Java原始碼
- jQuery原始碼剖析(五) - 事件繫結原理剖析jQuery原始碼事件
- 【Java集合原始碼剖析】LinkedList原始碼剖析Java原始碼
- 【Java集合原始碼剖析】LinkedHashmap原始碼剖析Java原始碼HashMap
- 開博爾HDMI線好不好用?開博爾百米光纖HDMI線全面剖析評測
- Memcached 原理剖析
- 深入剖析KafkaKafka
- Eureka原理剖析