J2ME как Sprite на Android

Для моего бесполезного проекта месяца я работаю над «эмулятором» для запуска программ J2ME на Android. Но теперь я застрял в реализации J2ME Sprite. В частности, используемые в нем преобразования.

В моем Sprite у меня есть растровое изображение с тремя изображениями символов. Я хотел бы нарисовать вторую рамку зеркально или повернутой на 90 градусов. Что было бы лучшим способом для этого?

У меня есть следующий код, который рисует данный кадр без каких-либо преобразований.

frameX, frameY — координаты положения кадра на растровом изображении заданного спрайта.

Rect src = new Rect(frameX, frameY, frameX + spriteWidth, frameY + spriteHeight);
Rect dst = new Rect(paintX, paintY, paintX + spriteWidth, paintY + spriteHeight);
canvas.drawBitmap(image, src, dst, null);

Насколько я понимаю, мне нужно сделать какую-то матричную магию на холсте, но я не смог разобраться с этим :)


person JaanusSiim    schedule 25.09.2009    source источник


Ответы (3)


Вы знаете, что Microemulator, проект с открытым исходным кодом, позволяет запускать код J2ME на Android, верно?

http://www.microemu.org/

Вы всегда можете взглянуть и посмотреть, что они делают.

person David N. Welton    schedule 25.09.2009

Пошел с разбиением спрайта на кадры и использованием трансформаций с одним изображением:

public final void paint(final Canvas canvas) {
  final Bitmap painted = images[frame];
  final Matrix matrix = createTransformationMatrix(transform);
  matrix.postTranslate(spriteX, spriteY);
  canvas.drawBitmap(painted, matrix, null);
}

private Matrix createTransformationMatrix(final int transform2) {
  final Matrix result = new Matrix();
  switch (transform2) {
  case TRANS_NONE:
    break;
  case TRANS_MIRROR_ROT180:
    result.setScale(-1, 1);
    result.postTranslate(getWidth(), 0);
    result.postRotate(180);
    break;
  case TRANS_MIRROR:
    result.setScale(-1, 1);
    result.postTranslate(getWidth(), 0);
    break;
  case TRANS_ROT180:
    result.postRotate(180);
    break;
  case TRANS_MIRROR_ROT270:
    result.setScale(-1, 1);
    result.postTranslate(getWidth(), 0);
    result.postRotate(270);
    break;
  case TRANS_ROT90:
    result.postRotate(90);
    break;
  case TRANS_ROT270:
    result.postRotate(270);
    break;
  case TRANS_MIRROR_ROT90:
    result.setScale(-1, 1);
    result.postTranslate(getWidth(), 0);
    result.postRotate(90);
    break;
  }
  return result;
}

Работает как шарм :)

person JaanusSiim    schedule 30.04.2010

Я не занимался разработкой для Android, но много занимался мобильными приложениями и много Java в этой мобильной разработке. Так что примите это к сведению.

После просмотра документации по классам Android (ссылка ниже) я бы сделал следующее:

Rect src = new Rect(frameX, frameY, frameX + spriteWidth, frameY + spriteHeight);
Rect dst = new Rect(paintX, paintY, paintX + spriteWidth, paintY + spriteHeight);
Matrix orig = canvas.getMatrix();
canvas.rotate(90.0f);
canvas.drawBitmap(image, src, dst, null);
canvas.setMatrix(orig);

Или вы можете сделать это так:

RectF src = new RectF(frameX, frameY, frameX + spriteWidth, frameY + spriteHeight);
RectF dst = new RectF(paintX, paintY, paintX + spriteWidth, paintY + spriteHeight);
Matrix matrix = canvas.getMatrix();
matrix.rotate(90.0f);
matrix.setRectToRect(src, dst, Matrix.ScaleToFit.FILL);
canvas.drawBitmap(image, matrix, null);

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

Список классов Android

Класс Android Canvas

Класс Android Matrix

person Fostah    schedule 26.09.2009
comment
matrix.setRectToRect принимает RectF, а не Rect - person tensaix2j; 24.10.2009