对于我这个月无用的项目,我正在使用'模拟器'在Android上运行J2ME程序。但现在我坚持使用J2ME 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);
据我了解,我需要在画布上制作一些矩阵魔法,但我无法弄明白:)
答案 0 :(得分:4)
答案 1 :(得分: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;
}
像魅力一样工作:)
答案 2 :(得分: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);
这两种方法对我来说都很好。我不确定两者是否更快。后一种解决方案更加模块化,因为您永远不必更改画布的矩阵。因此,这可能被认为是更好的解决方案。