這是我最近碰到的一個比較嚴重的問題,一直不能完美的解決。實在無奈之下,發帖到csdn android版提了一個問題,沒想到驚動了版主,給了我很大的協助,讓我可以完美的解決類似問題。決定以後蹲點csdn android論壇了。呵呵。
問題描述:
在WVGA 854 裝置上,圖片大小自適應變化得到的是錯誤結果,在我的項目上就是 圖片總會縮小。
比如說 854X90的圖片在經過自適應的時候,圖片寬度,高度會縮小1.5倍,這樣就會導致顯示的時候不能佔滿全屏。
問題分析:
我發現圖片讀取時正常的,是854x90,density 240也沒問題,和真機時一致的。但在一句代碼之後,density變成了160,高度,寬度同時縮小1.5倍。 這句代碼就是 BitmapDrawable drawable = new BitmapDrawable(bitmap);
很快我發現這是因為density發生了變化,android會自動根據density來對圖片進行自適應變化,從240 變 為 160,剛好是1.5倍,所以寬度,高度也相應的縮小1.5倍。
所以我確定問題是出在density上了,事實證明我的判斷也是對的。
解決方案:
在查閱android開發文檔後,發現從android 1.6開始才增加的根據density來自適應變化功能,而我們項目的api使用的是android 1.5。
1.5中沒有提供相應的API來根據真機的density來自適應,而是使用了一個預設的density 160. 這也就解釋了為什麼我每次經過BitmapDrawable的時候density變成了 160.
在1.6文檔說明中 我們項目中使用的api已經被deprected,而提供了根據resource來決定density的API介面
這是我們項目中使用的建構函式
BitmapDrawable
(Bitmap bitmap) This constructor is deprecated. Use BitmapDrawable(Resources, Bitmap)
to ensure that the drawable has correctly set its target density.
|
查閱API doc之後,我採用了下面這個建構函式
BitmapDrawable
(Resources res, Bitmap bitmap)Create drawable from a bitmap, setting initial target density based on the display metrics of the resources. |
這個api說明中明確說了,會跟根據真機的density來設定初始target density。
這樣BitmapDrawable就會根據正確的density來對圖片進行自適應變化。
調用這個建構函式中的第一個參數很容易獲得,直接調用activity.getResources()就可以獲得,第二個參數就是我們原始的map。
就此,這個問題成功解決。
大家有疑問的可以留言。