LWUIT兼容Nokia UI包文字特性

来源:互联网 发布:mac 怎样储存文件 编辑:程序博客网 时间:2024/05/16 08:50

         原创文章,转载请注明出处。

 

         前段时间公司做一个J2Me的项目,遇到一个很纠结的问题:LWUIT的应用在Nokia S60v5中中文默认的三种size的字体显示出来都太大了。LWUIT在支持中文中,不能随意更改文字的大小。而Nokia有一个UI包,在原生Me中可以随意更改应用中文字的大小和样式。

         那有没有一种办法可以将Nokia UI包集成到LWUIT中呢。

NokiaMe中三种字号分别是:

small             24

medium       28

large             32

LWUIT开发出来的易用中,在S60v5的机器上文字显示的效果不是很好,文字大小不符合屏幕比例(比较怀疑Nokia开发人员的审美),很粗糙,没有精细的感觉,这是很明显不符合需求。

于是,google之。

google了几天,无头绪。而上头又催进度。实在没办法,于是一边想办法,一边硬着头皮去看看源代码是怎么回事。

搞了一个多星期(失败,菜,没办法),才搞出了一点点眉目。其中经历了下面几个阶段。

 

阶段一:在LWUIT使用Nokia UI包,直接调用

com.nokia.mid.ui.DirectUtils.getFont(int face, int style, size);方法获取Font实例引用。很明显,该方法行不通。为何呢?虽然LWUITFont类和原生MeFont类的大部分方法都一样,但他们不是同一个类,即使是强制转换,不是抛异常就是没效果的。

 

阶段二:前面知道NokiaUI包可以随意控制字体的大小,以为LWUIT的字体大小控制是经过映射诺基亚系统的字体大小来实现的,想通过对比LWUITFont类和原生的Font类找出差别,然后通过更改Font类来实现更改字体大小效果的,失败了。后来想想,觉得真搞笑,LWUIT又不是针对Nokia做的UI架构,很明显行不通嘛。放弃之。

 

阶段三:后期发现LWUIT是使用原生J2MEGameCanvas衍生出来的一个轻量UI架构(用了LWUIT半年多才知道,失败),LWUIT上的UI和原生的UI是不兼容的,所以直接在LWUIT上使用Nokia UI 开发包会出现如阶段一一样的效果,不是抛异常就是没效果。于是,去找GameCanvas实现LWUIT的源头,那就是LookAndFeel.java抽象类,这是LWUIT架构所有UI元素生成都在该类里面定义。LookAndFeel.java是抽象类,并没有实现以下方法。具体的实现在DefaultLookAndFeel.java类。

 

    public abstract void drawButton(Graphics g, Button b);

    public abstract void drawCheckBox(Graphics g, Button cb);

    public abstract void drawComboBox(Graphics g, List cb);

    public abstract void drawLabel(Graphics g, Label l);

    public abstract void drawList(Graphics g, List l);

    public abstract void drawRadioButton(Graphics g, Button rb);

    public abstract void drawTextArea(Graphics g, TextArea ta);

    public abstract void drawTextField(Graphics g, TextArea ta);

    public abstract void drawTextFieldCursor(Graphics g, TextArea ta);

public abstract void drawTabbedPane(Graphics g, TabbedPane tp);

而字体实现的重点就在DefaultLookAndFeel.java类的getNativeFont(Font f)方法。源代码如下:

 

    public static javax.microedition.lcdui.Font getNativeFont(Font f) {

return javax.microedition.lcdui.Font.getFont(f.getFace(), f.getStyle(), f.getSize());

}

 

看到这里,已经很明显了。LWUIT字体的实现是基于Me的字体的。也就是说,在这里可以使用Nokia UI工具包的字体了。^_^

         将与字体相关的代码做一下判断,就可以随意的使用Nokia UI的字和Me默认字体了。

         剩下的就是体力活了。

 

 

PS:该方法仅对Nokia Symbian系统手机有效。目前仅对Nokia S60v5的手机做过测试,其他平台均未测试。请有需要的朋友自行测试。

 

 

 

原创粉丝点击