在LWUIT组件上绘制javax.microedition.lcdui.Graphics
在LWUIT元素上绘制自定义元素(使用J2ME本机图形)的最佳方法是什么?
custom元素是来自映射库的实现,将其内容(例如Google map)绘制到Graphics对象。如何将结果直接绘制在LWUIT元素上(目前,我正在尝试将其绘制在Component上)。
在LWUIT包中编写包装的唯一方法是公开其内部实现吗?
编辑:
约翰:解决方案看起来像很多工程设计:P我最终使用的是以下包装器:
package com.sun.lwuit; public class ImageWrapper { private final Image image; public ImageWrapper(final Image lwuitBuffer) { this.image = lwuitBuffer; } public javax.microedition.lcdui.Graphics getGraphics() { return image.getGraphics().getGraphics(); } }
现在,我可以从LWUIT获得'native'Graphics元素。在其上有效地在LWUIT图像上绘画。而且我可以使用图像在组件上绘画。
而且它看起来仍然像黑客一样:)
但是真正的问题是即使混淆后代码开销也高达50kB。但这是另一个帖子的问题:)
/贾纳斯·西姆(JaanusSiim)
解决方案
回答
基于LWUIT和J2ME的javadoc,并猜测自定义J2ME类是Canvas,看起来我们将必须:
- 包裹自定义J2ME组件的LWUIT的Component类的子类
- 重写LWUIT组件的paint()方法
- 子类化包装LWUIT Graphics类的J2ME Graphics类,并将所有方法调用传递给
- 将包装的J2ME Graphics实现传递给自定义J2ME组件的paint方法
第三步很丑。检查LWUIT邮件列表,看看以前是否有人有圆顶。从已发布的API中,我看不到另一种方法。
编辑:在问题中添加的hack看起来比我对Image的hack更好。在一般情况下,我所拥有的可能会更好,但是我对LWUIT或者J2ME的了解还不够,无法真正说出来。
回答
我认为没有必要进行任何黑客攻击。我们可以继承LWTUI Component类的子类,然后可以对组件的图形上下文进行任何操作。我们不会获得本机的lcdui.Graphics对象,而是具有易于使用的具有相同接口的对象。
如果我们确实需要将lcdui.Graphics传递给某个基础库以显示其输出,则建议这样做:
组件代码中的某个位置(仅在确实需要更改组件内容时才执行此操作):
private Image buffer = null; // keep this int[] bufferArray = new int[desiredWidth * desiredHeight]; javax.microedition.lcdui.Image bufferImage = Image.createEmptyImage(desiredWidth, desiredHeight); thirPartyComponent.paint(bufferImage.getGraphics()); bufferImage.getRGB(bufferArray,0,1,0,0,desiredWidth, desiredHeight); bufferImage = null; //no longer needed buffer = Image.createImage(bufferArray, desiredWidth, desiredHeight);
在组件paint(g)方法中:
g.drawImage(0,0, buffer);
通过进行黑客攻击,我们失去了可移植性,而且还暗示我们要暴露实现私有对象,因此我们可能还会破坏其他东西。
希望这可以帮助。