天天看點

Android中螢幕Density對BitmapDrawable的影響

很早之前寫的文章了,發在這裡記錄一下。

在之前的某個項目中,出現了一個奇怪的問題,所有應該擷取大分辨率圖檔(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下)的現象。

    解決方法:

Android中螢幕Density對BitmapDrawable的影響

    當平台為1.6以上,設定一下Drawable的Density值既可解決問題。

    風險:

1.對于1.5平台下,分辨率不是480*320的終端,仍然會出現縮水或膨脹現象。