android - 在android中绘制镜像位图

标签 android bitmap

我正在尝试学习如何在 android 中制作动画 Sprite ,但不知道如何组织我的位图。我有一个我的角色向右走的 Sprite 表:一个角色的五个副本的位图,等距(每 45 像素),在一个行走周期中。

我计划通过一次绘制 Sprite 表位图的一小部分来绘制每一帧:

Rect sourceRect = new Rect(0, 0, 45, 75);
canvas.drawBitmap(spriteSheetBitmap, sourceRect, new Rect(0, 0, 45, 75), null);

然后对于下一帧,将“sourceRect.x”增加 45,然后重绘等等。

但是,我现在不知道如何让我的 Sprite 向左移动。我最初以为我可以镜像我正在绘制的矩形以获得翻转的图片。比如:

sourceRect = new Rect(45, 0, 0, 75);

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

在网上搜索,看来我应该复制我的原始位图,用变换矩阵对其进行镜像,然后在向左行走时使用该位图进行绘图。然而,我也发现了许多较小的位图对象从原始 Sprite 表中创建、存储(并为镜像运动转换)然后根据需要使用的实现。

所以我想知道在这种情况下什么是最好的,或者是否真的有任何区别(性能/内存):

方法1:加载我原来的 Sprite 表,创建一个新的位图实例,镜像它,然后计算所有的矩形并使用那些+两个完整的表来绘制(诚然有一些未使用 Sprite 表的额外位图空间)。

方法 2: 加载到我的原始 Sprite 表中,为每一帧创建一个新的两个位图对象(1 个镜像,1 个正常)并存储它们以供绘制。

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

最佳答案

方法 2 太贵了,而且你不需要 Canvas 来翻转位图。只需创建另一个应用了 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);
}

关于android - 在android中绘制镜像位图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7925278/

相关文章:

android - 我如何将 HTTP 响应从一个 Activity 传递到 android 中的另一个 Activity

android - 为什么相机 Intent 不返回文件路径?

xml - 关于膨胀 xml 的 InvocationTargetException - android

java - 为什么我的文字不显示?

c# - 锁定不会阻止 InvalidOperationException : Object is currently in use elsewhere

android maps v2 多边形透明度

java - 多次调用自定义 ListView 适配器 getView 方法,并且顺序不一致

java - org.mapsforge.core.graphics.Bitmap 和 android.graphics.Bitmap 之间的任何关联方法

java - Android 旋转位图中的像素,但位图变成白色/丢失

android - 使用 Uri 获取 Exif 数据