很早之前寫的文章了,發在這裡記錄一下。
在之前的某個項目中,出現了一個奇怪的問題,所有應該擷取大分辨率圖檔(HDPI)都取成了中分辨率的圖檔。檢視android源代碼及工程代碼後,發現問題出現在系統的Density上。
造成問題的原因:
1.在manifest.xml中設定了:
<supports-screens android:anyDensity="true"/>
2.采用Drawable繪圖而不是bitmap繪圖。
3.使用了1.5平台API建立Drawable
造成問題原因的原因:
Android平台中,當程式在manifest中設定android:anyDensity="true"後,系統會對建立的bitmap進行縮放,縮放的根據就是Density。Density的對應值如下:
Density | Value |
HDPI | 240 |
MDPI | 160 |
LDPI | 120 |
縮放公式簡化後的形式如下:
ScaledWidth = ActWidth * targetDensity/MDPI
注:targetDensity目前裝置的Density;MDPI平台預設值
是以,一張48*48的圖檔在LDPI下面就變成了36*36(計算:48*120/160),在HDPI上面則是72*72。
到目前為止,Bitmap的建立根據Density進行縮放的機制是一切正常的,但問題就出在BitmapDrawable的建立上。BitmapDrawable的建立也會根據Density進行縮放的,但這個Density的值預設是MDPI,而更改Density值的方法隻有在1.6平台API之後才有。是以,就出現了取出來的圖檔是正确的,但建立的BitmapDrawable出現了縮水(HDPI下)或者膨脹(LDPI下)的現象。
解決方法:
當平台為1.6以上,設定一下Drawable的Density值既可解決問題。
風險:
1.對于1.5平台下,分辨率不是480*320的終端,仍然會出現縮水或膨脹現象。