我在寫一個自定義類。有一個位圖需要在實際繪製前進行一些預處理和大小計算。位圖本身是一個預處理的9貼片圖像。在構造函數中,有這樣的代碼:BitmapFactory.Options#outWidth返回與實際位圖不同的大小
寬度::在7" 三星Galaxy Tab 7運行Android 3.2.2
BitmapFactory.Options bmpOptions = new BitmapFactory.Options(); bmpOptions.inJustDecodeBounds = true; BitmapFactory.decodeResource(getResources(), BITMAP_ID, bmpOptions); Bitmap bmp = BitmapFactory.decodeResource(getResources(), BITMAP_ID); Log.d(getClass().getSimpleName(), "width: " + bmp.getWidth() + " " + bmpOptions.outWidth + "; height: " + bmp.getHeight() + " " + bmpOptions.outHeight);
輸出556 556;高度:890 890
運行Android 4.1的10英寸摩托羅拉Xoom的輸出:
width:556 556;高度:890上890
輸出7" 的Nexus 7運行Android 4.2.2:
寬度:740 834;高度; 1185 1335
位圖的實際尺寸有:
MDPI:558 X 892
ħ dpi:836 x 1337
位圖是一個預處理的9貼片,這就是爲什麼尺寸偏離2像素。我不明白爲什麼Nexus 7上的hdpi資產會使這種差異變得更大。
我已經嘗試了這些配置,以及:
bmpOptions.inScaled = false;
和
bmpOptions.inTargetDensity = getResources().getDisplayMetrics().densityDpi;
和
bmpOptions.inTargetDensity = getResources().getDisplayMetrics().densityDpi;
bmpOptions.inDensity = getResources().getDisplayMetrics().densityDpi;
和
bmpOptions.inTargetDensity = 0;
bmpOptions.inDensity = 0;
我也嘗試了相反的方法,併爲解碼的位圖創建了第二個BitmapFactory.Options,並告訴它根本不能縮放。
所有這些提供了相同的確切結果。
我在這裏做的是一個測試。基本上,我解碼兩次相同的位圖。一旦只有邊界和其他直線。如果你將'inJustBounds'設置爲true,理論上(根據文檔),我應該能夠得到所產生的位圖的大小,而不用使用時間和內存來創建它。但是,如圖所示,情況並非如此。事實上兩者互不影響是重點。 – DeeV 2013-03-02 14:37:34
當我將它放入'no-dpi'文件夾時,我會看到會發生什麼,但是我發現奇怪的是'BitmapFactory'在縮放另一個時不縮放。它*應該*都做。 – DeeV 2013-03-02 14:39:04
我把圖像放在nodpi文件夾中,它工作。我發現它非常令人不安,因爲'inJustBound'的整個目的是爲了給你圖像的尺寸而不用完全解碼**。 – DeeV 2013-03-04 13:35:18