4

对于我本月无用的项目,我正在开发一个“模拟器”来在 Android 上运行 J2ME 程序。但现在我坚持使用 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);

据我了解,我需要在画布上制作一些矩阵魔法,但我无法弄清楚:)

4

3 回答 3

4

您知道 Microemulator,一个开源项目,可以在 Android 上运行 J2ME 代码,对吧?

http://www.microemu.org/

你总是可以看看他们在做什么。

于 2009-09-25T19:32:24.963 回答
3

将精灵分割成帧并使用单个图像的转换:

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

奇迹般有效 :)

于 2010-04-30T21:15:26.337 回答
2

我没有做过任何 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 矩阵类

于 2009-09-26T10:20:55.337 回答