0

在 LWUIT 元素上绘制自定义元素(即使用 J2ME 本机图形)的最佳方法是什么?

自定义元素是映射库的一个实现,它将其内容(例如 Google 地图)绘制到 Graphics 对象。怎么可能直接在 LWUIT 元素上绘制结果(目前我正试图在组件上绘制它)。

在 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 获得“本机”图形元素。在上面绘画 - 有效地在 LWUIT 图像上绘画。我可以使用图像在组件上进行绘制。

而且它看起来仍然像一个黑客:)

但真正的问题是 50kB 的代码开销,即使经过了混淆处理。但这是另一个帖子的问题:)

/亚努斯西姆

4

2 回答 2

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

通过你所做的黑客攻击,你失去了可移植性,而且你暴露了实现私有对象,你可能还会破坏其他东西。

希望这可以帮助。

于 2008-09-17T18:45:20.260 回答
0

基于 LWUIT 和 J2ME 的 javadoc 并猜测自定义 J2ME 类是Canvas看起来您必须:

  • 封装自定义 J2ME 组件的子类LWUIT 的 Component 类
  • 覆盖 LWUIT 组件的 paint() 方法
  • 子类化包装 LWUIT Graphics 类的J2ME Graphics类并传递所有方法调用
  • 将包装的 J2ME 图形实现传递给自定义 J2ME 组件的绘制方法

第三步是丑陋的一步。检查LWUIT 邮件列表,看看是否有人以前做过这个。从已发布的 API 中,我看不到另一种方法。

编辑:问题中添加的 hack 看起来比我对图像的 hack 更好。对于一般情况,我所拥有的可能会更好,但我对 LWUIT 或 J2ME 的了解都不够好,无法真正这么说。

于 2008-09-08T00:52:37.933 回答