如果您想自己缩放图像,请将单个副本放入:
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 然后将图像密度设置为与屏幕匹配,因此在您绘制时它也不会缩放。编译器将对放置在 res/drawable-xxx 文件夹中的图像应用无损压缩。
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 加载图像之前,它必须定位文件。资源比资产更快地定位,因此如果将图像打包为资产,可能会有一些性能损失。)