在LWUIT组件上绘制javax.microedition.lcdui.Graphics

时间:2020-03-05 18:42:14  来源:igfitidea点击:

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

通过进行黑客攻击,我们失去了可移植性,而且还暗示我们要暴露实现私有对象,因此我们可能还会破坏其他东西。

希望这可以帮助。