2016-02-22 25 views
0

看來,BitmapFactory.decodeResource()被忽略inScaled時inJustDecodeBounds也是 「真」。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 

我所做的只是改變inJustDecodeBounds從真爲假。我錯過了什麼?

回答

1

也許答案應該很明顯: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中的所有代碼;你爲什麼讓我重寫它。只需提供一個不同的標誌,即可執行所有操作,但只顯示位圖。然後,一個標誌,我可以計算範圍,並且通過翻轉標誌,呈現一個位圖正好契合。

+0

你說「應該」,但我沒有看到它在Javadoc。所以,這無論是在文檔或缺陷在平臺中的錯誤,但我們不知道哪一個。 –

+0

好吧,讓我把我的「諷刺」的帽子。在我看來,很多谷歌的Android文檔都給你的想象留下了很多語義細節。 –

+0

你是對的。這就是爲什麼他們讓你提交bug:https://code.google.com/p/android/issues/entry?template=Developer%20Documentation –