- 論壇徽章:
- 0
|
Sun發(fā)布了LWUIT(Light-Weight UI Toolkit)的源代碼以及示例代碼。項(xiàng)目主頁訪問:https://lwuit.dev.java.net/
The Lightweight UI Toolkit (LWUIT) 是一個(gè)輕量級JavaME UI工具包。LWUIT類似Swing 的MVC架構(gòu), 支持多種布局(Layouts), 皮膚更換, 字體, 觸摸屏, 動(dòng)畫效果, Rich控件, 3D集成, Painter, 模式對畫框, I18N/L10N等。
學(xué)習(xí)Lwuit時(shí),一些基礎(chǔ)知識是一定要掌握的,以下是一些基本應(yīng)用,包括組件的一些基本屬性,使用方式,以及布局,并提及一些需要注意的地方。
在MIDlet中初始化Lwuit 也是唯一使用原有J2me的東西
可以在startApp方法中定義啟動(dòng)的過程
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) {
}
簡單的使用一個(gè)內(nèi)置Form進(jìn)行顯示,而無須使用一個(gè)而外的類
Form f = new Form();
f.setTitle("Hello World");
f.setLayout(new BorderLayout());
f.addComponent("Center", new Label("I am a Label"));
f.show();
注意使用show方法進(jìn)行顯示
組件介紹
關(guān)于組件的使用,我一共列出了21條:
1。Component,Container,Form
2。Label
3。Button
4。RadioButton,ButtonGroup,CheckBox,ComboBox
5。TextArea
6。TabbedPane
7。 使用 Lists
8。ListCellRenderer 渲染器
9。使用 Dialogs 對話框
10。使用LayoutManagers 使用布局管理器(BorderLayout,BoxLayout,FlowLayout,GridLayout,GroupLayout)
11。使用 Painter
12。Using the Style Object 設(shè)置樣式對象
13。Theming 皮膚
14。Resources 資源
15。Localization (L10N) 本地化
16。M3G 用于實(shí)現(xiàn)3D功能,需要手機(jī)的支持 Jsr184
17。Logging 日志,可以保存在RMS或者本地文件中
18。創(chuàng)建自定義的組件,只要繼承Component對象,然后重寫paint方法即可,類似Canvas的操作
19。用于在窗口變化時(shí)候獲取合適的顯示效果
20。影響內(nèi)存使用的因素
21。Speed 速度方面
1。Component,Container,Form
Component 用于顯示到頁面上的基礎(chǔ)部分,可以理解為DisplayObject,也就是組件部分
Container 用于保存多個(gè)Components的容器類型,提供了布局的能力
Form : 提供title和menus,并且提供一個(gè)content放置Components,并且提供了content的滾動(dòng)能力,addComponent,用于添加Components到Content中
Form mainForm = new Form("Form Title"); //聲明一個(gè)帶標(biāo)題的Form
mainForm.setLayout(new BorderLayout()); //設(shè)置布局管理器
mainForm.addComponent(BorderLayout.CENTER, new Label(“Hello,World”)); //添加Components組件,
mainForm.setTransitionOutAnimator(CommonTransitions.createFade(400)); //設(shè)置動(dòng)畫
mainForm.addCommand(new Command("Run", 2)); //添加菜單命令
mainForm.show(); //顯示Form
1:可以使用帶參數(shù)的構(gòu)造函數(shù),設(shè)置標(biāo)題.也可以不設(shè)置標(biāo)題的構(gòu)造函數(shù)
2:addComponent() 方法提供兩個(gè)重載,區(qū)別在于是否指定布局位置
3:Transition動(dòng)畫用于在forms之間進(jìn)行切換時(shí)候觸發(fā)
4:Form通過Commands添加菜單,根據(jù)添加順序排序顯示,其他使用與普通的J2me一樣
2。Label
Label: 可以同時(shí)顯示圖片和文字,設(shè)置align布局,可以通過繼承Label實(shí)現(xiàn)擴(kuò)展,如果更復(fù)雜,可以使用Button
Label textLabel = new Label("I am a Label"); //創(chuàng)建一個(gè)單行文本
Image icon = Image.createImage("/images/duke.png");
Label imageLabel = new Label(icon); //創(chuàng)建一個(gè)帶圖片的Label
setTextPosition(int alignment); //設(shè)置布局方式,CENTER, LEFT, RIGHT,LEFT,TOP, BOTTOM, LEFT, RIGHT,
3。Button
Button 可以用于觸發(fā)一個(gè)點(diǎn)擊的事件Action,使用一個(gè)ActionListeners 進(jìn)行監(jiān)聽
final Button button = new Button("Old Text");
//使用匿名的ActionListener接口實(shí)現(xiàn)類進(jìn)行監(jiān)聽
button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
button.setText("New Text");
}});
Button繼承Label, 所以可以設(shè)置不同圖文混編的風(fēng)格,并且提供了三種狀態(tài)ollover, pressed, and the default state
4。RadioButton,ButtonGroup,CheckBox,ComboBox
- RadioButton 單選按鈕,繼承自Button
RadioButton radioButton = new RadioButton(“Radio Button”);
同樣,也會觸發(fā)action
- ButtonGroup 用于保證RadioButton只能選中一項(xiàng)
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中,同樣也觸發(fā)事件
final CheckBox checkBox = new CheckBox(“Check Box”);
通過checkBox.isSelected() 判斷是否被選中
- ComboBox 列表,只允許一個(gè)被選中,多用于空間有限時(shí)候提供多選項(xiàng)的單選功能
創(chuàng)建需要一個(gè)數(shù)組作為數(shù)據(jù)源
String[] content = { "Red", "Blue", "Green", "Yellow" };
ComboBox comboBox = new ComboBox(content); //創(chuàng)建一個(gè)Combox,在這個(gè)構(gòu)造函數(shù)中也是使用List實(shí)現(xiàn)
comboBox.setListCellRenderer(new checkBoxRenderer()); //設(shè)置renderer 渲染器
也可以使用addActionListener注冊事件
通過實(shí)現(xiàn)不同的renderer接口可以給組件提供不同的顯示效果 implements ListCellRenderer
5。TextArea
TextArea textArea = new TextArea(5, 20, TextArea.NUMERIC);
textArea.setEditable(false);
構(gòu)造函數(shù)的前兩個(gè)參數(shù)為 總行數(shù)和單行長度,第三個(gè)參數(shù)用于傳遞到本地文本輸入,用于指定限制的類型
可以使用TextArea的常量 ANY,EMAILADDR, NUMERIC, PHONENUMBER, URL, or DECIMAL,PASSWORD, UNEDITABLE, SENSITIVE,NON_PREDICTIVE, INITIAL_CAPS_SENTENCE, INITIAL_CAPS_WORD.也可以使用 | 設(shè)置復(fù)合約束 ,默認(rèn)情況下可編輯
6。TabbedPane
TabbedPane 通過類似Tab的選項(xiàng)卡方式并排放置一組容器,容器的tab標(biāo)簽可以使用圖文混編方式
可以使用addTab or insertTab methods 方法添加容器
removeTabAt(int index) 移除容器
tab的索引由0開始
tab標(biāo)簽可以有四種不同的放置方法 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"));
構(gòu)造函數(shù)使用一個(gè)Tab標(biāo)簽布局的常量作為參數(shù)
addTab,第一個(gè)為tab標(biāo)簽名,第二個(gè)參數(shù)為直接放置到容器中的內(nèi)容
7。 Using Lists
- List,使用Swing的 MVC模式進(jìn)行創(chuàng)建
rendered using a ListCellRenderer and are extracted using the ListModel.
使用ListCellRenderer 作為顯示的V
使用ListModel. 作為數(shù)據(jù)源M
其他部分為C進(jìn)行操作
- 創(chuàng)建List 有四個(gè)構(gòu)造函數(shù)
List()
List(ListModel model) //直接實(shí)例化ListModel
List(Object[] items) //Array數(shù)組
List(Vector items) //Vector集合
- ListModel 也可以分為自定ListModel的實(shí)現(xiàn),以及DefaultListModel
DefaultListModel的使用
String[] items = { "Red", "Blue", "Green", "Yellow" };
DefaultListModel myListModel = new DefaultListModel(items); //使用Array作為數(shù)據(jù)源
8。ListCellRenderer 渲染器
- 同樣也可以自定ListCellRenderer的實(shí)現(xiàn),以及DefaultListCellRenderer
自定義的時(shí)候,可以通過繼承Label,來節(jié)約開發(fā)的速度 ,主要實(shí)現(xiàn)兩個(gè)方法
public class MyYesNoRenderer extends Label implements ListCellRenderer{
public Component getListCellRendererComponent(List list, Object value, int index, boolean isSelected) {
((Boolean)value).booleanValue() 來獲取單項(xiàng)的值
}
public Component getListFocusComponent(List list) {
Label label = new label("");
label.getStyle().setBgTransparency(100);
return label;
}}
- DefaultListCellRenderer,默認(rèn)也是使用Label and the ListCellRenderer interface.
實(shí)現(xiàn)兩個(gè)方法,大體和上面相同
getListCellRendererComponent()
getListFocusComponent() //選中風(fēng)格,可以通過修改透明度來表現(xiàn)
添加的方法有兩種,創(chuàng)建一個(gè)ListModel,然后add到list中,重置一個(gè)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) 區(qū)別于常用的Action
SelectionListener 應(yīng)該會更有用一些
- Fixed Selection Feature 應(yīng)該是只有一行的List,不彈出菜單的模式 //具體還是demo才知道
通過 setFixedSelection(int fixedSelection) 進(jìn)行設(shè)置
通過四個(gè)常量屬性進(jìn)行設(shè)置
FIXED_NONE //普通的List
FIXED_TRAIL //靜態(tài)
FIXED_LEAD // ...下面兩種都需要用demo看下區(qū)別
FIXED_CENTER
setSmoothScrolling(true) //設(shè)置這個(gè)屬性,應(yīng)該是在移動(dòng)時(shí)增加動(dòng)畫效果,默認(rèn)為false
9。Using Dialogs 對話框
也提供一個(gè)Content,可以存放其他的Components //對于是否阻塞線程,需要了解一下
- Dialog提供了五種不同的類型,默認(rèn)附加了不同的提示音
ALARM //警告
CONFIRMATION //確認(rèn)
ERROR //錯(cuò)誤
INFO //信息
WARNING //警告提示
當(dāng)前默認(rèn)情況下不支持Icon,不過可以自定義Dialog
- 調(diào)用dialog的show()方法進(jìn)行顯示,提供的參數(shù)很多,可以選擇合適的重載進(jìn)行顯示
1:String title 標(biāo)題
2:Component body 一個(gè)單獨(dú)的Component
3:String text 用于代替Component body部分
4:Command[] cmds 可以添加Commands
5:int type 設(shè)置不同的類型
6:Image icon 添加icon
7:timeout 打開持續(xù)時(shí)間,設(shè)置成0表示為持續(xù)打開
8:Transition transition 添加動(dòng)畫
9:String okText 設(shè)置Ok按鈕的內(nèi)容
10:String cancelText 設(shè)置cancel的內(nèi)容
11:int top 設(shè)置top所在位置
12:int bottom 設(shè)置bottom位置
13:int left 同上
14:int right 同上
15:boolean includeTitle //需要了解下
show方法可以返回三個(gè)類型 void,Command,boolean
boolean值在點(diǎn)擊ok時(shí)為true, cancel時(shí)為null
使用非靜態(tài)的方法顯示Dialog
dialog.show(90, 90, 10, 10, true);
關(guān)閉dialog dispose()
需要先show之前設(shè)置timer去關(guān)閉dialog
Dialog也可以返回一個(gè)Command 區(qū)別于點(diǎn)擊OK按鈕
10。Using LayoutManagers 使用布局管理器
BorderLayout
BoxLayout
FlowLayout
GridLayout
GroupLayout
- BorderLayout 邊框布局模式(東西南北中)
如下五個(gè)區(qū)域
Center
East
North
South
West
在添加Components的時(shí)候進(jìn)行設(shè)置
addComponent(BorderLayout.CENTER, component) // preferred
或者直接使用字符串
addComponent(“Center”, component) // valid but error prone 容易出錯(cuò)
包括了 X_AXIS(橫向) Y_AXIS(豎向)的布局,并排的方式
BoxLayout boxLayout = new BoxLayout(BoxLayout.X_AXIS);
BoxLayout boxLayout = new BoxLayout(BoxLayout.Y_AXIS);
這個(gè)也是容器默認(rèn)的布局方式
橫向布局,如果長度超出,則自動(dòng)換行處理
FlowLayout exampleLayout = new FlowLayout();
container.setLayout(exampleLayout);
也可以通過設(shè)置構(gòu)造函數(shù),用于設(shè)置布局起始的位置,比如 Left, Right, or Center
FlowLayout exampleLayout = new FlowLayout(Component.RIGHT);
- GridLayout 表格式布局,可以用于設(shè)置九宮圖
可以定制行和列,
GridLayout exampleLayout = new GridLayout(0,2); //2表示每行顯示兩個(gè)單元格cell,0不知道是啥
// GUI builders 的方式進(jìn)行布局,用于NetBeans中的Swing開發(fā)
11。Using Painters
是一個(gè)接口,可以用于繪制一個(gè)Components的背景,將繪制在Components限定的范圍內(nèi)
如果要查看painter繪制結(jié)果,需要設(shè)置對應(yīng)的transparency //需要查看下
painter可以使用絕對坐標(biāo)的繪圖,所以可以重用在其他組件之上
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
使用時(shí)候只要給指定的組件設(shè)置Painter即可
myComponent.getStyle().setBgPainter(diagonalPainter);
將會自動(dòng)應(yīng)用繪圖
記得顯示的調(diào)用設(shè)置透明度 0-255之間
myButton.getStyle().setBgTransparency(100);
12。Using the Style Object 設(shè)置樣式對象
The Style object sets colors, fonts, transparency, margin, padding, images, and borders to define the style for a given component.
使用component.getStyle(). 獲取該對象,可以在運(yùn)行時(shí)候改變
Foreground color 前景色,主要指文字顏色
Foreground selection color 當(dāng)組件獲取焦點(diǎn)時(shí),字體的顏色
Background color 背景色
Background selection color 獲取焦點(diǎn)時(shí)候的背景色
這里顏色使用的是RGB(格式為0x000000),不帶alpha透明色,有而外的透明設(shè)置在Style中
setBgTransparency進(jìn)行設(shè)置 范圍是0-255之間
- Margin and Padding 外邊距和內(nèi)間距,與css的盒模型一樣
設(shè)置的方式
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
這兩個(gè)類型方法的區(qū)別在于同時(shí)設(shè)置一個(gè)屬性,還是多個(gè)屬性
- Images 背景色,默認(rèn)為不限制背景色 使用bgImage 可以用于進(jìn)行設(shè)置
- Borders邊框類型
myComponent.getStyle().addStyleListener(new StyleListener() {
public void styleChanged(String propertyName, Style source) {}
}}
Painters也可以用于在Style中設(shè)置樣式,用于按照要求繪制背景
mycomponent.getStyle().setBgPainter(myPainter);
13。Theming 皮膚
refreshTheme()方法用于更新所有的樣式,不過手動(dòng)修改的樣式元素,并不會被更新
Button.font – font for all buttons //將會作用到所有Button組件的字體
font- 將會影響到所有沒有定義默認(rèn)值的組components件
這里不像css那樣有特殊的單獨(dú)樣式設(shè)置
fgColor 前景色 16進(jìn)制的格式
bgColor 背景色 16進(jìn)制的格式,也可以使用縮寫ff
bgSelectionColor 背景選中色 16x
fgSelectionColor 前景選中色 16x
bgImage 背景圖片
transparency 設(shè)置背景圖樣式透明色 0-255之間,不過目前對背景圖無效
- font 分為Bitmap font和System font 定義的方式為Bitmap{myFontName} 和System{face;style;size}
其中系統(tǒng)字體的參數(shù)為
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值設(shè)置背景圖使用平鋪tiled還是重復(fù)scaled 默認(rèn)為true,重復(fù)scaled
margin 外邊距,使用四個(gè)參數(shù)進(jìn)行設(shè)置,代表top, bottom, left, and right. For example, 1, 2, 3, 4
padding 內(nèi)邊距,使用與margin類似
使用Resources.open("/javaTheme.res");//進(jìn)行加載
使用UIManager.getInstance().setThemeProps(r.getTheme(r.getThemeResourceNames()[0]));//進(jìn)行設(shè)置
然后可以使用components.refreshTheme 更新組件的樣式
- LookAndFeel DefaultLookAndFeel 似乎是用來定義一些樣式無法修改到的東西,比如滾動(dòng)條,具體要看API Documention
14。Resources 資源
LWUIT允許的resource elements的元素包括:
Image Resources //圖像資源
Animation Resources //動(dòng)畫資源
Bitmap Fonts //位圖字體
Localization (L10N) //本地化
Themes //主題
可以通過專門的編輯器 Resource Editor 或者Ant tasks來創(chuàng)建Resources
Loading a Resource 讀取一個(gè)資源文件
Resources res = Resources.open(“/myresourceFile.res”);
Image i = res.getImage(“imageName”);
圖片可以保存在res文件中,或者直接放置在jar文件中
讀取jar中圖片的方式
Image image = Image.createImage("/images/duke.png");
image的標(biāo)簽,應(yīng)該是res配置的時(shí)候,可以有三個(gè)屬性
name //名稱,默認(rèn)為文件名
file //圖像文件所在位置
pack //boolean值 ,默認(rèn)為false ,用于設(shè)置是否為Indexed
圖像少于256色的時(shí)候,可以使用Index image,有利于節(jié)約空間
1:因?yàn)樾枰凑障袼氐娜ゲ僮鲌D像,所以在顯示的時(shí)候速度比較慢,不過在現(xiàn)在的手機(jī)上并不明顯
2:在運(yùn)行時(shí)轉(zhuǎn)換indexed image將會比較慢,而且可能會失敗,所以應(yīng)該在編譯時(shí)候進(jìn)行轉(zhuǎn)換
3:Indexed image并沒有在res文件中被壓縮,所以res文件看起來比較大,不過在jar文件中卻能被很好的壓縮,而且效果比使用png更好
4:indexed images 創(chuàng)建后將不能被改變,比如getGraphics(),詳情看API
LWUIT支持從Gif文件中得到動(dòng)畫效果,保存的結(jié)構(gòu)類似image structure
StaticAnimation 用于操作動(dòng)畫..派生自Image,所以可以直接使用在icon或者其他地方
LWUIT支持bitmap fonts and system fonts.
System Font 包括了三個(gè)參數(shù)
Face //如FACE_SYSTEM, FACE_PROPORTIONAL and FACE_MONOSPACE.
Style //如STYLE_PLAIN, STYLE_ITALIC, STYLE_BOLD.
Size //如SIZE_SMALL, SIZE_MEDIUM, SIZE_LARGE.
在類的內(nèi)部可以去創(chuàng)建字體引用
Font.createSystemFont(Font.FACE_SYSTEM,Font.STYLE_BOLD,Font.SIZE_MEDIUM);
同時(shí)也可以去創(chuàng)建復(fù)合類型的字體(加粗和傾斜)
Font.createSystemFont(Font.FACE_SYSTEM,Font.STYLE_BOLD | Font.STYLE_ITALIC,Font.SIZE_MEDIUM);
Bitmap Fonts
三個(gè)屬性
name //在res文件中,用于程序加載
charset //就是包含的字符,默認(rèn)為24個(gè)字母,數(shù)字和一些符號
src //字體文件TrueType所在位置
size //字體大小
bold //是否加粗,默認(rèn)為false
trueType //默認(rèn)為true,根據(jù)src屬性決定是否生效
antiAliasing //默認(rèn)為true,如果為false表示別名
logicalName //邏輯名稱,表示不同的字體編碼類型,類似css中使用的4個(gè)大區(qū)字體
//這里注意文檔中只介紹了使用ant創(chuàng)建Bitmap font,具體還是要查看API文檔
15。Localization (L10N) 本地化
類似Properties文件的使用,使用鍵值對的方式保存在Resources中,只支持使用USASCII碼的形式
Hashtable h = bundle.getL10N("localize", "en"); //bundle應(yīng)該是Resources的實(shí)例
UIManager.setResourceBundle(Hashtable) //可以用于替換當(dāng)前語言
使用ResourceEdit.exe 可以很方便的進(jìn)行編輯
加載到程序:
UIManager.getInstance().setThemeProps(res.getTheme(“myTheme”));
編輯器創(chuàng)建的默認(rèn)就是Bitmap font
使用字體需要注意版權(quán)問題... 使用編輯器的時(shí)候,可以通過設(shè)置 Anti-aliasing 達(dá)到反鋸齒的能力
Using Transitions and Animations
使用過度效果以及動(dòng)畫
支持的Transition有,可用于form之間進(jìn)行的轉(zhuǎn)換
Slide
Fade
Slide Transition
在第一個(gè)form中定義
CommonTransitions.createSlide(int type, boolean forward, int speed)
參數(shù)
type //定義移動(dòng)的方向,包括了SLIDE_HORIZONTAL or SLIDE_VERTICAL
forward //用一個(gè)boolean值表示,不同方向時(shí),起始位置,比如左到右,不過上到下
speed //用int表示的應(yīng)該是動(dòng)畫持續(xù)的時(shí)間,從而在內(nèi)部計(jì)算運(yùn)行的速度
使用的例子
myForm.setTransitionOutAnimator(CommonTransitions.createSlide(
CommonTransitions.SLIDE_HORIZONTAL, true, 1000));
Fade Transition 漸變效果 (淡入淡出)
CommonTransitions.createFade(int speed)
參數(shù)
speed 同樣表示動(dòng)畫持續(xù)時(shí)間,毫秒為單位
例子
themeForm.setTransitionInAnimator(CommonTransitions.createFade(400));
16。M3G 用于實(shí)現(xiàn)3D功能,需要手機(jī)的支持 Jsr184
//加載源碼.注意需要使用jdk1.4進(jìn)行編譯
調(diào)用的方式通過 M3G.Callback內(nèi)部類接口的實(shí)例來創(chuàng)建3d動(dòng)畫對象
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
...
}
注意這里的區(qū)別Graphics3D 和普通的Graphics對象
M3G目前只支持標(biāo)準(zhǔn)的圖像文件,而不支持IndexedImage and RGBImage
17。Logging 日志,可以保存在RMS或者本地文件中
DEBUG //默認(rèn)級別
INFO
WARNING
ERROR
記錄日志的方式
使用static p(String text) or p(String text,int level) methods.
Log.p(“Finish loading images”)
顯示日志
Log.showLog();
18。創(chuàng)建自定義的組件,只要繼承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());
}}
在頁面上進(jìn)行使用的時(shí)候,就和其他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原有組件一樣,只要重寫對應(yīng)key事件即可
public void keyReleased(int keyCode) {
if(keyCode >= '0' && keyCode Components組件中的事件,要求當(dāng)前組件獲取焦點(diǎn)后才會觸發(fā)
setFocusable(true); //使其獲取焦點(diǎn)
使用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));
}
不過一些方法不錯(cuò) 以及常量, 可能第一個(gè)方法是初始化組件中參數(shù)的狀態(tài)
229136
Background 使用Painter來繪制,允許透明translucent與不透明opaque
對自定義組件添加Animating動(dòng)畫支持
protected void initComponent() {
getComponentForm().registerAnimated(this);
}
不能在構(gòu)造函數(shù)中進(jìn)行注冊
自定義組件的例子
關(guān)鍵方法一
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);
}
19。用于在窗口變化時(shí)候獲取合適的顯示效果
主要使用到的方法
1: Style style=getStyle(); //獲取當(dāng)前組件默認(rèn)樣式對象
2: style.getPadding(LEFT) //獲取左內(nèi)邊距
3: getX(), getY()獲取x,y參數(shù)
4: style.getFont().stringWidth(inputString); 獲取樣式默認(rèn)字體的寬度,其中inputString為輸入的字符串
5: style.getFont().getHeight() 獲取字體的高度
該方法返回的是 new Dimension(width, height); 對象,需要驗(yàn)證下有何效果
注冊動(dòng)畫效果
protected void initComponent() {
getComponentForm().registerAnimated(this);
}
修改動(dòng)畫效果細(xì)節(jié)
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;
}
20。影響內(nèi)存使用的因素
計(jì)算一個(gè)圖片在不同手機(jī)上的所占用的內(nèi)存
長 寬
16 bit: 128 * 128 * 2 = 32,768 一張全屏的圖片所占用的內(nèi)存
24 bit: 320 * 240 * 4 = 307,200
這里用的是8的倍數(shù)來進(jìn)行計(jì)算, 24位會被當(dāng)做32位計(jì)算
可以使用Indexed images 來代替. 不過缺點(diǎn)是只支持256色,優(yōu)點(diǎn)在于更少的內(nèi)存使用率
Display's 的init()方法可以關(guān)閉一些占用內(nèi)存較多的特性
21。Speed 速度方面
Event Dispatch Thread (EDT) 事件發(fā)送線程
Display methods callSerially, callSeriallyAndWait, and invokeAndBlock. 通過這幾個(gè)方法進(jìn)行調(diào)用特別的線程處 理
Light Mode 不是很清楚用途
turning off light mode (after Display.init())
本文來自ChinaUnix博客,如果查看原文請點(diǎn):http://blog.chinaunix.net/u/20442/showart_2143333.html |
|