inJustDecodeBounds 也是 "true" 时,BitmapFactory.decodeResource() 似乎忽略了 inScaled。
在此代码片段中:
Resources res = getResources ();
DisplayMetrics metrics = res.getDisplayMetrics ();
BitmapFactory.Options options = new BitmapFactory.Options ();
options.inScaled = true;
options.inDensity = DisplayMetrics.DENSITY_HIGH; // resolution of bitmap in resources
options.inTargetDensity = metrics.densityDpi; // screen resolution
options.inJustDecodeBounds = true;
Bitmap bitmap = BitmapFactory.decodeResource (res, srcId, options);
logD ("IVH decodeBitmapResource.1: " + options.outWidth + "," + options.outHeight + " - " + srcId);
options.inJustDecodeBounds = false;
bitmap = BitmapFactory.decodeResource (getResources(), srcId, options);
logD ("IVH decodeBitmapResource.2: " + options.outWidth + "," + options.outHeight + " - " + srcId);
我在日志文件中得到以下输出:
IVH decodeBitmapResource.1: 420,747 - 2130837613
IVH decodeBitmapResource.2: 840,1494 - 2130837613
我所做的只是将JustDecodeBounds从true更改为false。 我错过了什么?
也许答案应该是显而易见的:inJustDecodeBounds应该忽略所有其他指令,甚至是扩展。
当将 inJustDecodeBounds 设置为 "true" 时,以下代码解决了这个问题:
float scale = (float)metrics.densityDpi / (float)DisplayMetrics.DENSITY_HIGH;
imageWidth = (int) (options.outWidth * scale + 0.5);
imageHeight = (int) (options.outHeight * scale + 0.5);
也就是说,来谷歌。 您已经拥有此 API 中的所有代码;你为什么要让我重写它。 只需提供一个不同的标志,该标志可以执行除呈现位图之外的所有操作。 然后,使用一个标志,我可以计算边界,并通过翻转标志来渲染完全适合的位图。