在android中绘制镜像位图

mit*_*tim 24 android bitmap

我正在尝试学习如何在android中制作一个动画精灵,并且无法弄清楚如何组织我的位图.我有一个我的角色的精灵表向右走:一个五位副本的位图,在一个步行循环中等间距(每45px).

我计划通过以下方式一次绘制我的精灵表位图的一小部分来绘制每个帧:

Rect sourceRect = new Rect(0, 0, 45, 75);
canvas.drawBitmap(spriteSheetBitmap, sourceRect, new Rect(0, 0, 45, 75), null);
Run Code Online (Sandbox Code Playgroud)

然后对于下一帧,将"sourceRect.x"递增45,然后重绘,依此类推.

但是,我现在还不确定如何让我的精灵走向左边.我原本以为我可以只镜像我正在绘制的矩形以获得翻转图片.就像是:

sourceRect = new Rect(45, 0, 0, 75);
Run Code Online (Sandbox Code Playgroud)

这似乎不起作用(不确定这里实际发生了什么,但没有任何东西被吸引到我的表面).

在线搜索,似乎我应该复制我的原始位图,用变换矩阵镜像它,然后在向左走时使用该位图进行绘制.但是我也发现了一些实现,其中许多较小的位图对象是从原始精灵表中创建的,存储(并为镜像运动转换),然后根据需要使用.

所以我想知道在这种情况下最好的是什么,或者确实存在任何差异(性能/内存):

方法1:加载我的原始精灵表,制作一个新的位图实例,镜像它,然后计算所有的矩形并使用那些+两个整张纸来绘制(诚然,有一些额外的位图空间,其中未使用精灵表) .

方法2:在我的原始精灵表中加载,为每个帧创建一个新的两个位图对象(1个镜像,1个正常)并存储要从中绘制的对象.

方法3:其他更好的方法?

use*_*717 70

方法2太昂贵了,你不需要画布来翻转位图.只需创建另一个应用了Matrix的位图,如下所示:

BitmapDrawable flip(BitmapDrawable d)
{
    Matrix m = new Matrix();
    m.preScale(-1, 1);
    Bitmap src = d.getBitmap();
    Bitmap dst = Bitmap.createBitmap(src, 0, 0, src.getWidth(), src.getHeight(), m, false);
    dst.setDensity(DisplayMetrics.DENSITY_DEFAULT);
    return new BitmapDrawable(dst);
}
Run Code Online (Sandbox Code Playgroud)

  • 我用`matrix.preScale(1,-1)`修复了镜像效果.出于某种原因,`matrix.preScale(-1,1)`垂直镜像图像. (3认同)

Rom*_*Guy 17

要镜像您的精灵,只需在Canvas上应用以下变换:scale(-1,1).你也必须用它的宽度来偏移精灵.