提问者:小点点

根据屏幕密度获得可绘制的实际尺寸


我有一个用于 mdpi、hdpi 和 xhdpi 的可绘制资源(png 图像)。此图像用作背景,并根据其宽度调整另一个位图的大小并将其绘制。

mdpi、hdpi和xhdpi的一切都很好,因为我的每个密度的可绘制文件夹都有图像。问题出现在不同的密度上,例如在1080p屏幕的Galaxy S4上运行

这是我的做法:

//Get the bitmap width

BitmapFactory.Options dimensions = new BitmapFactory.Options();
dimensions.inJustDecodeBounds = true;
BitmapFactory.decodeResource(getResources(), R.drawable.ic_marker_void, dimensions);
        int width = dimensions.outWidth;

我在测试中发现,在 80p 屏幕上运行时宽度为 720 像素,但在 1080p 设备上运行时,宽度也是 80 像素。这与 xhdpi 文件夹中的 png 大小相同。

但实际上,当我在1080p屏幕上显示图像时,图像被正确地缩放了。所以它确实采用了xhdpi图像,但它在显示之前对其进行了缩放。作为旁注,图像被用作地图标记背景。

我的问题是:我如何才能获得图像的宽度——它在屏幕上的渲染方式,而不是xhdpi文件夹中的图像大小?


共2个答案

匿名用户

也许这就是你所寻找的:< br >正如你所说,这假设你的代码对mdpi、hdpi和xhdpi都工作良好,并且当大于xhdpi时返回xhdpi宽度。

float width;
BitmapFactory.Options dimensions = new BitmapFactory.Options();
dimensions.inJustDecodeBounds = true;
BitmapFactory.decodeResource(getResources(), R.drawable.ic_marker_void, dimensions);

float densityFactor = this.getResources().getDisplayMetrics().density;
if(densityFactor > 2)  // 2 -> xhdpi
    width = dimensions.outWidth / 2 * densityFactor;
else
    width = dimensions.outWidth;

匿名用户

您可以为高端设备创建draable-xxhdpi。

drawable-xxhdpi
drawable-xxxhdpi 

res目录中的这两个文件夹有助于支持非常高的hdpi设备。。。