我知道android会自动缩放由dpi从res / drawable加载的Bitmaps。当我为我的游戏加载资源时,我使用BitmapFactory选项手动关闭它,例如tileset。
//Loads Bitmaps for the tileset
public void loadTiles(int s) {
Bitmap subimage = null;
BitmapFactory.Options o = new BitmapFactory.Options();
o.inScaled = false;
Bitmap tileset = BitmapFactory.decodeResource(activity.getResources(), s, o);
try {
numTilesAcross = tileset.getWidth() / tileSize;
tiles = new Tile[3][numTilesAcross];
for(int col = 0; col < numTilesAcross; col++) {
subimage = Bitmap.createBitmap(tileset,
col * tileSize,
0,
tileSize,
tileSize
);
tiles[0][col] = new Tile(subimage, Tile.UNBLOCKED);
subimage = Bitmap.createBitmap(tileset,
col * tileSize,
tileSize,
tileSize,
tileSize
);
tiles[1][col] = new Tile(subimage, Tile.BLOCKED);
subimage = Bitmap.createBitmap(tileset,
col * tileSize,
2 * tileSize,
tileSize,
tileSize
);
tiles[2][col] = new Tile(subimage, Tile.TRIGGER);
}
}
catch(Exception e) {
e.printStackTrace();
}
}
问题是当我将它们绘制到我的画布(然后绘制到Surface视图)时,如果我在低于mdpi的任何dpi上测试游戏,则瓷砖缩放得太小而且间距不大,如果我测试任何东西它们被绘制得越大越重叠。
主要问题是使用dpi因子缩放的方法。我使用
绘制图像//tiles[r][c].getImage() returns a Bitmap
canvas.drawBitmap(
tiles[row][col].getImage(),
(int)x + col * tileSize,
(int)y + row * tileSize,
null
);
canvas.drawBitmap()是否使用dpi进行缩放?或者是在我的loadTiles(int s)方法中获取子图像的方式进行缩放?我检查了loadTiles中加载的位图的宽度/高度,它们是我想要的大小。
注意:我自己将最终图像缩放到屏幕上,绘制到画布的所有位图的大小应该是dpi独立的。
编辑: 以下是一些正在发生的事情的图片...... 这是mdpi,它是如何支持的 http://cdn.img42.com/e9359c298455d505c3317bd705372030.png
这是hdpi,注意事物如何被重新调整并重叠在它们之前绘制的图块 http://cdn.img42.com/540b7896947049250fea3f3fa5a08331.png
这是ldpi,注意瓷砖太小而且它们之间留有空间 img42 / 420e938b3eebc503247cd0181b779402fe.png
答案 0 :(得分:1)
我明白了。我正在阅读Canvas的文档,我必须通过调用
加载画布和位图时的密度canvas.setDensity(DisplayMetrics.DENSITY_MEDIUM);
bitmap.setDensity(DisplayMetrics.DENSITYMEDIUM);
相关文件:
https://developer.android.com/reference/android/graphics/Canvas.html#setDensity%28int%29
https://developer.android.com/reference/android/graphics/Bitmap.html#setDensity%28int%29
我还可以将所有图像像素密度设置回系统像素密度,然后将其子图像加载到其工作表中,以便游戏看起来更好,缩小/倾斜