LWUIT精简解说 21条(转)

来源:互联网 发布:flume windows 编辑:程序博客网 时间:2024/05/17 12:47

Sun发布了LWUIT(Light-Weight UI Toolkit)的源代码以及示例代码。项目主页访问:https://lwuit.dev.java.net/
  The Lightweight UI Toolkit (LWUIT) 是一个轻量级JavaMEUI工具包。LWUIT类似Swing 的MVC架构, 支持多种布局(Layouts), 皮肤更换, 字体, 触摸屏, 动画效果,Rich控件, 3D集成, Painter, 模式对画框, I18N/L10N等。

     学习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("HelloWorld");
   f.setLayout(newBorderLayout());
   f.addComponent("Center", newLabel("I am a Label"));
   f.show();
   注意使用show方法进行显示


组件介绍
关于组件的使用,我一共列出了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 设置样式对象

13。Theming 皮肤

14。Resources 资源

15。Localization (L10N) 本地化

16。M3G 用于实现3D功能,需要手机的支持 Jsr184

17。Logging 日志,可以保存在RMS或者本地文件中

18。创建自定义的组件,只要继承Component对象,然后重写paint方法即可,类似Canvas的操作

19。用于在窗口变化时候获取合适的显示效果

20。影响内存使用的因素

21。Speed 速度方面


1。Component,Container,Form
     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, newLabel(“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一样

2。Label
     Label: 可以同时显示图片和文字,设置align布局,可以通过继承Label实现扩展,如果更复杂,可以使用Button

 提供的一些方法和使用方式 
     Label textLabel = new Label("I am a Label"); //创建一个单行文本
     Image icon = Image.createImage("/images/duke.png");
     Label imageLabel = newLabel(icon);  //创建一个带图片的Label
     setTextPosition(int alignment); //设置布局方式,CENTER, LEFT,RIGHT,LEFT,TOP, BOTTOM, LEFT, RIGHT,


3。Button
     Button 可以用于触发一个点击的事件Action,使用一个ActionListeners 进行监听
     final Button button  = new Button("OldText");
       //使用匿名的ActionListener接口实现类进行监听
     button.addActionListener(new ActionListener() {
     public void actionPerformed(ActionEvent evt) {
     button.setText("New Text");
     }});
     Button继承Label, 所以可以设置不同图文混编的风格,并且提供了三种状态ollover, pressed, and thedefault state


4。RadioButton,ButtonGroup,CheckBox,ComboBox

RadioButton 单选按钮,继承自Button 
     RadioButton radioButton = new RadioButton(“Radio Button”);
     同样,也会触发action

 ButtonGroup用于保证RadioButton只能选中一项 
     RadioButton rb1 = new RadioButton("First RadioButton in Group1");
     RadioButton rb2 = new RadioButton("Second RadioButton in Group1");
     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

 5。TextArea
例子 
     TextArea textArea = new TextArea(5, 20, TextArea.NUMERIC);
     textArea.setEditable(false);
     构造函数的前两个参数为 总行数和单行长度,第三个参数用于传递到本地文本输入,用于指定限制的类型
     可以使用TextArea的常量 ANY,EMAILADDR, NUMERIC, PHONENUMBER, URL, orDECIMAL,PASSWORD, UNEDITABLE, SENSITIVE,NON_PREDICTIVE,INITIAL_CAPS_SENTENCE, INITIAL_CAPS_WORD.也可以使用 | 设置复合约束,默认情况下可编辑


6。TabbedPane  
     TabbedPane  通过类似Tab的选项卡方式并排放置一组容器,容器的tab标签可以使用图文混编方式
     可以使用addTab or insertTab methods 方法添加容器
     removeTabAt(int index) 移除容器
     tab的索引由0开始
     tab标签可以有四种不同的放置方法  LEFT, RIGHT, TOP or BOTTOMusing 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标签名,第二个参数为直接放置到容器中的内容

7。 Using Lists

List,使用Swing的 MVC模式进行创建 
     rendered using a ListCellRenderer and are extracted using theListModel.
     使用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 = newDefaultListModel(items);  //使用Array作为数据源

8。ListCellRenderer 渲染器

同样也可以自定ListCellRenderer的实现,以及DefaultListCellRenderer 
     自定义的时候,可以通过继承Label,来节约开发的速度 ,主要实现两个方法
     public class MyYesNoRenderer extends Label implementsListCellRenderer{
     public Component getListCellRendererComponent(List list, Objectvalue, 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 ListCellRendererinterface. 
     实现两个方法,大体和上面相同
     getListCellRendererComponent()
     getListFocusComponent()  //选中风格,可以通过修改透明度来表现


添加或移除item 
     添加的方法有两种,创建一个ListModel,然后add到list中,重置一个List 使用setModel(ListModelmodel). 方法
     移除的方法有removeItem(int index) or removeAll() methods.
     myListModel.addItem(“New Item”); //添加Item
     myListModel.removeItem(index);  //删除Item
     myListModel.removeAll(); //删除所有Item


List 事件 提供了两种事件 ActionEvent andSelectionsListener 
     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

9。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按钮


10。Using LayoutManagers 使用布局管理器

已经的布局管理器 
     BorderLayout
     BoxLayout
     FlowLayout
     GridLayout
     GroupLayout


BorderLayout 边框布局模式(东西南北中) 
     如下五个区域
     Center
     East
     North
     South
     West

     在添加Components的时候进行设置
     addComponent(BorderLayout.CENTER, component) // preferred
     或者直接使用字符串
     addComponent(“Center”, component) // valid but errorprone  容易出错


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开发


11。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);

12。Using the Style Object 设置样式对象
     The Style object sets colors, fonts, transparency, margin, padding,images, and borders to define the style for a givencomponent.
     使用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);


13。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 

14。Resources 资源
     LWUIT允许的resource elements的元素包括:
     ImageResources      //图像资源
     Animation Resources  //动画资源
     BitmapFonts      //位图字体
     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:Indexedimage并没有在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文档

15。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, intspeed)
     参数
     type  //定义移动的方向,包括了SLIDE_HORIZONTAL orSLIDE_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));


16。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


17。Logging 日志,可以保存在RMS或者本地文件中

也分为了四种级别 
     DEBUG  //默认级别
     INFO
     WARNING
     ERROR

     记录日志的方式
     使用static p(String text) or p(String text,int level) methods.
     Log.p(“Finish loading images”)

     显示日志
     Log.showLog();

 18。创建自定义的组件,只要继承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);
       }

19。用于在窗口变化时候获取合适的显示效果
     主要使用到的方法
     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;
     }


20。影响内存使用的因素
     计算一个图片在不同手机上的所占用的内存
     长 宽   
     16 bit: 128 * 128 * 2 = 32,768  一张全屏的图片所占用的内存
     24 bit: 320 * 240 * 4 = 307,200
     这里用的是8的倍数来进行计算, 24位会被当做32位计算
     可以使用Indexed images 来代替. 不过缺点是只支持256色,优点在于更少的内存使用率
     Display's 的init()方法可以关闭一些占用内存较多的特性

21。Speed 速度方面
     Event Dispatch Thread (EDT) 事件发送线程
     Display methods callSerially, callSeriallyAndWait,and  invokeAndBlock. 通过这几个方法进行调用特别的线程处 理

     Light Mode 不是很清楚用途
     turning off light mode (after Display.init()) 

 

原创粉丝点击