哪些 Canvas 和位图方法按 dpi (Android) 缩放?
Which Canvas and Bitmap methods get scaled by dpi (Android)?
我知道 android 会按 dpi 自动缩放从 res/drawable 加载的位图。当我为我的游戏加载资源(例如 tileset)时,我使用 BitmapFactory 选项手动关闭它。
//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();
}
}
问题是当我将它们绘制到我的 Canvas(然后绘制到表面视图)时,如果我在低于 mdpi 的任何 dpi 上测试游戏,则图块被缩放得太小 space 之间,如果我测试更高的东西,它们会画得太大并且重叠。
主要问题是什么方法使用 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 中加载的位图的 width/height,它们是我想要的大小。
注意:我自己将最终图像缩放到屏幕,绘制到 canvas 的所有位图的大小应该与 dpi 无关。
编辑:
这是一些正在发生的事情的照片......
这是 mdpi,应该是这样的
http://cdn.img42.com/e9359c298455d505c3317bd705372030.png
这是 hdpi,请注意事物是如何缩放并与在它们之前绘制的图块重叠的
http://cdn.img42.com/540b7896947049250fea3f3fa5a08331.png
这是 ldpi,请注意图块太小,它们在中间留下 space
img42/420e938b3eebc503247cd0181b779402fe.png
我明白了。我正在阅读 Canvas 的文档,我必须在 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
我还可以在从工作表中加载它们的子图像后,将所有图像的像素密度设置回系统像素密度,这样游戏看起来会更漂亮、更少 scaled/skewed
我知道 android 会按 dpi 自动缩放从 res/drawable 加载的位图。当我为我的游戏加载资源(例如 tileset)时,我使用 BitmapFactory 选项手动关闭它。
//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();
}
}
问题是当我将它们绘制到我的 Canvas(然后绘制到表面视图)时,如果我在低于 mdpi 的任何 dpi 上测试游戏,则图块被缩放得太小 space 之间,如果我测试更高的东西,它们会画得太大并且重叠。
主要问题是什么方法使用 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 中加载的位图的 width/height,它们是我想要的大小。
注意:我自己将最终图像缩放到屏幕,绘制到 canvas 的所有位图的大小应该与 dpi 无关。
编辑: 这是一些正在发生的事情的照片...... 这是 mdpi,应该是这样的 http://cdn.img42.com/e9359c298455d505c3317bd705372030.png
这是 hdpi,请注意事物是如何缩放并与在它们之前绘制的图块重叠的 http://cdn.img42.com/540b7896947049250fea3f3fa5a08331.png
这是 ldpi,请注意图块太小,它们在中间留下 space img42/420e938b3eebc503247cd0181b779402fe.png
我明白了。我正在阅读 Canvas 的文档,我必须在 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
我还可以在从工作表中加载它们的子图像后,将所有图像的像素密度设置回系统像素密度,这样游戏看起来会更漂亮、更少 scaled/skewed