如果您想自己缩放图像,请放入一个副本:
res/drawable-nodpi
确保该资源不在其他文件夹中。
像这样加载位图:
Bitmap bitmap = BitmapFactory.decodeResource(
context.getResources(),
R.drawable.my_image
);
像这样调整它的大小:
bitmap = Bitmap.createScaledBitmap(bitmap, width, height, true);
然后将其绘制到您的画布上:
canvas.drawBitmap(bitmap, 0, 0, null);
这是完成工作所需的最少知识。
补充说明
通常,Android 会根据当前屏幕密度从 res/drawable 文件夹之一中选择您的图像。
大多数图像格式没有密度信息,因此 Android 根据加载位图的文件夹来假设位图的密度。
这意味着它可以进行自己的缩放以匹配加载位图的密度与画布密度。
Android 在您加载位图时检查和匹配密度一次,并在您绘制位图时再次。
当您进行自己的扩展时,您通常希望防止操作系统干扰。有几种方法可以做到:
1.使用 res/drawable-nodpi
这是我在上面的快速示例中概述的策略。如果您想将图像打包为资源,并且仍然自己控制缩放,请将其放在这里,并且只放在这里:
res/drawable-nodpi
如果您需要支持 Cupcake,请在每个文件夹中放置一份副本:
res/drawable-nodpi-v4
res/drawable
解码器会自动提供防止缩放的选项。 Android 然后将图像密度设置为与屏幕匹配,因此在您绘制时它也不会缩放。 The compiler will apply lossless compression to images placed in res/drawable-xxx folders。
2。使用 res/raw
如果你把它放进去,你可以让编译器不改变它:
res/raw
但是你需要小心防止在运行时缩放:
BitmapFactory.Options options = new BitmapFactory.Options();
options.inScaled = false; // Prevents scaling at decode time.
Bitmap bitmap = BitmapFactory.decodeResource(
context.getResources(),
R.raw.my_image,
options
);
bitmap.setDensity(Bitmap.DENSITY_NONE); // Prevents scaling at draw time.
3.使用资产文件夹
如果您将图像放在 assets 文件夹中,而不是 res 中,则可以使用真正的文件夹结构来组织它们。像这样加载位图资源:
Bitmap bitmap = BitmapFactory.decodeStream(
context.getAssets().open(
"myfolder/my_image.png",
AssetManager.ACCESS_BUFFER
)
);
编译器不会碰它,它加载时不缩放,它的密度设置为与屏幕匹配,所以当你绘制它时也不会缩放。
(性能说明:在 Android 加载图像之前,它必须找到文件。A resource is faster to locate than an asset,因此如果您将图像打包为资产,可能会有一些性能损失。)