在LWUIT元素上绘制自定义元素(使用J2ME原生图形)的最佳方法是什么?
自定义元素是映射库中的一个实现,它将其内容(例如Google地图)绘制到Graphics对象。如何直接在LWUIT元素上绘制结果(目前我正在尝试在Component上绘制它)。
是在LWUIT包中编写包装器的唯一方法,它会暴露它的内部实现吗?
修改
John: 您的解决方案看起来像很多工程: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'图形元素。画上它 - 有效地在LWUIT图像上绘画。我可以使用图像在组件上绘画。
它仍然看起来像黑客:)
但真正的问题是50kB的代码开销,即使在混淆之后。但这是另一个帖子的问题:)
/ JaanusSiim
答案 0 :(得分:2)
我认为没有必要进行任何黑客攻击。您可以对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);
通过执行黑客操作,您确实失去了可移植性,而且您也暴露了实现私有对象,您可能也会破坏其他内容。
希望这有帮助。
答案 1 :(得分:0)
基于LWUIT和J2ME的javadoc并猜测自定义J2ME类是Canvas,它看起来像你必须:
第三步是丑陋的。检查LWUIT mailing list以查看是否有人在此之前使用此框架。从已发布的API中我看不到另一种方法。
编辑:问题中添加的黑客看起来比我的黑客图像更好。对于一般情况,我所拥有的可能更好,但我不知道LWUIT或J2ME是否足以说明这一点。