0

我正在尝试在屏幕上绘制一个精灵表动画,这在我使用此代码之前效果很好。

    canvas.drawColor(Color.TRANSPARENT);
    Rect src = new Rect(CurrentSprite.x * SheetSize.x, CurrentSprite.y * SheetSize.y, (CurrentSprite.x * SheetSize.x) + SheetSize.x, (CurrentSprite.y * SheetSize.y) + SheetSize.y);
    Rect dst = new Rect(X, Y, X + SheetSize.x, Y + SheetSize.y);
    canvas.drawBitmap(bmp, src, dst, null);

但是,我现在需要先旋转图像,然后再将其绘制在屏幕上。所以我更改了代码,所以我正在制作精灵的本地副本。我要画这个但是在这里我遇到了问题。我正在使用 Bitmap.createBitmap 方法,但该方法似乎没有任何作用,因为当我查看屏幕时,屏幕上会绘制完整的精灵表,有时我会遇到 OutOfMemoryException(可以理解,因为完整图像非常大)。

    canvas.drawColor(Color.TRANSPARENT);
    Matrix matrix = new Matrix();
    matrix.postRotate(Degrees);
    Bitmap tempAnimationBmp = Bitmap.createBitmap(bmp, CurrentSprite.x * SheetSize.x, CurrentSprite.y * SheetSize.y, (CurrentSprite.x * SheetSize.x) + SheetSize.x, (CurrentSprite.y * SheetSize.y) + SheetSize.y, matrix, true);
    canvas.drawBitmap(tempAnimationBmp, X, Y, null);
    tempAnimationBmp.recycle();

为什么我会得到完整的精灵表?

4

1 回答 1

0

我建议使用其中一个DrawableContainer而不是尝试创建一堆位图。Drawables 非常易于使用——您只需设置尺寸,将其传递给画布,它就会将自己绘制到该位置的画布上。Drawable 的优点在于它们也很容易制作,因此您可以创建一个自定义 SpriteDrawable 类,该类从系统中获取资源并仅将其区域绘制到画布上。

通过处理这个流程而不是尝试创建一堆位图,您将节省大量内存,并且在您尝试更多地使用 Android 的图形系统时可能会让人头疼。

于 2012-09-26T18:46:46.973 回答