黑莓应用程序,如何在另一个图像文件的顶部添加图像?

时间:2009-12-02 07:10:54

标签: graphics blackberry drawing bitmap overlay

我正在尝试为黑莓开发一个类似地图的小应用程序。我需要知道如何将一个小图像放在另一个更大的图像上。

较大的图像就像一张地图,我需要使用较小的图像来指向地图上的特定位置。因此较小的图像应覆盖在较大的图像上方。同时,我需要移动地图,较小的图像应该跟随地图上的那个位置。

有没有人知道这个问题是否有特定的API?

3 个答案:

答案 0 :(得分:1)

示例将图标位图定位在地图位图的中心位置:

class Scr extends MainScreen {
    Bitmap mMapBitmap = Bitmap.getBitmapResource("map.png");
    Bitmap mIconBitmap = Bitmap.getBitmapResource("icon.png");

    Bitmap getOverlappedBitmap(Bitmap map, Bitmap icon) {
        Graphics g = new Graphics(map);
        int width = icon.getWidth();
        int height = icon.getHeight();
        int x = (map.getWidth() - width) / 2;
        int y = (map.getHeight() - height) / 2;
        g.drawBitmap(x, y, width, height, icon, 0, 0);
        return map;
    }

    public Scr() {
        add(new BitmapField(getOverlappedBitmap(mMapBitmap, mIconBitmap)));
    }
}
  • 创建位图数组
  • 从新位图创建图形并绘制具有已定义alpha值的所有位图
  • 使用自定义类PNGEncoder来保存位图png图像

参见示例

class Scr extends MainScreen {
 Bitmap[] images = new Bitmap[0];

 int width = Display.getWidth();
 int height = Display.getHeight();
 Bitmap bitmap = new Bitmap(width, height);
 BitmapField bitmapField = new BitmapField(bitmap);

 public Scr() {
  add(bitmapField);
 }

 MenuItem mAddBitmap = new MenuItem("Add image", 0, 0) {
  public void run() {
   Bitmap image = Bitmap.getBitmapResource("img" + (images.length + 1)
     + ".png");
   Arrays.add(images, image);
   refresh();
  }
 };

 MenuItem mClean = new MenuItem("Clean", 0, 0) {
  public void run() {
   images = new Bitmap[0];
   refresh();
  }
 };

 MenuItem mSave = new MenuItem("Save", 0, 0) {
  public void run() {
   String mFileName = System.getProperty("fileconn.dir.photos")
     + "test.bmp";

   // bitmap to byte array conversion
   byte[] bitmapBuffer = new byte[0];
   PNGEncoder encoder = new PNGEncoder(bitmap, true);
   try {
    bitmapBuffer = encoder.encode(true);
   } catch (IOException e) {
    e.printStackTrace();
   }

   writeFile(bitmapBuffer, mFileName);
  }
 };

 private void writeFile(byte[] data, String fileName) {
  FileConnection fconn = null;
  try {
   fconn = (FileConnection) Connector.open(fileName,
     Connector.READ_WRITE);
  } catch (IOException e) {
   System.out.print("Error opening file");
  }

  if (fconn.exists())
   try {
    fconn.delete();
   } catch (IOException e) {
    System.out.print("Error deleting file");
   }
  try {
   fconn.create();
  } catch (IOException e) {
   System.out.print("Error creating file");
  }
  OutputStream out = null;
  try {
   out = fconn.openOutputStream();
  } catch (IOException e) {
   System.out.print("Error opening output stream");
  }

  try {
   out.write(data);
  } catch (IOException e) {
   System.out.print("Error writing to output stream");
  }

  try {
   fconn.close();
  } catch (IOException e) {
   System.out.print("Error closing file");
  }
 }

 void refresh() {

  bitmap = new Bitmap(width, height);

  Graphics g = new Graphics(bitmap);

  for (int i = 0; i < images.length; i++) {
   g.setGlobalAlpha(100);
   g.drawBitmap(0, 0, width, height, images[i], 0, 0);
  }

  bitmapField.setBitmap(bitmap);
 }

 protected void makeMenu(Menu menu, int instance) {
  super.makeMenu(menu, instance);
  menu.add(mAddBitmap);
  menu.add(mSave);
  menu.add(mClean);
 }
}

答案 1 :(得分:0)

在Blackberry(以及其他基于java的移动设备)上,您可以根据需要堆叠尽可能多的位图。

请确保您在第一个位图上绘制的位图包含透明像素,以便查看位和不规则形状。

最好的方法是使用png8,其中一种颜色设置为完全透明。

现代手机越多,现在就可以使用alpha值,可以用于半透明效果。若要尝试Blackberry也支持此功能,请将png32图像用于第二个位图,并确保某些像素具有半透明alpha值(例如128)。

答案 2 :(得分:0)

对于透明度,请检查此图形类&gt; setGlobalAlpha方法。您可以根据所需的透明度将其值设置为0-100。

http://www.blackberry.com/developers/docs/4.0.2api/net/rim/device/api/ui/Graphics.html http://www.blackberry.com/developers/docs/4.0.2api/net/rim/device/api/ui/Graphics.html#setGlobalAlpha%28int%29