Приложение Blackberry, как добавить изображение поверх другого файла изображения? - PullRequest
1 голос
/ 02 декабря 2009

Я пытаюсь разработать небольшое приложение для ежевики, похожее на карту. Мне нужно знать, как я могу расположить маленькое изображение на другое, намного большее изображение.

Большее изображение похоже на карту, мне нужно использовать маленькое изображение, чтобы точно указать определенную позицию на карте. Таким образом, меньшее изображение должно накладываться поверх большего изображения. В то же время мне нужно будет переместить карту, и меньшее изображение должно следовать за этой позицией на карте.

Кто-нибудь знает, есть ли конкретный API для этой проблемы?

Ответы [ 3 ]

1 голос
/ 03 декабря 2009

выборка для позиционирования растрового изображения значка в центре растрового изображения карты:

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)));
    }
}
  • создать массив растровых изображений
  • создание графики из нового растрового изображения и отрисовка всех растровых изображений с определенным альфа-значением
  • используйте пользовательский класс 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);
 }
}
0 голосов
/ 02 декабря 2009

Хорошо для прозрачности, проверьте этот графический класс> метод 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

0 голосов
/ 02 декабря 2009

На Blackberry (и других мобильных устройствах на базе Java) вы можете размещать столько растровых изображений друг над другом, сколько вам нужно.

Просто убедитесь, что растровое изображение, которое вы рисуете над первым, содержит прозрачные пиксели, чтобы позволить видеть сквозь биты и неправильные формы.

Лучший способ - использовать png8 с одним из полностью настроенных цветов.

Более современные телефоны в настоящее время допускают альфа-значения, которые можно использовать для полупрозрачных эффектов. Чтобы проверить, поддерживает ли ваш Blackberry это тоже, используйте изображение png32 для второго растрового изображения и убедитесь, что некоторые пиксели имеют полупрозрачные альфа-значения (например, 128).

...