在APP開發(fā)過程中,我們會進行一些性能上的優(yōu)化,比如布局上,當想實現(xiàn)文字旁邊有個圖片的效果,
谷歌官方建議不要用
TextView+ImageView+外部裹一層布局的方法,
而推薦使用TextView的方法
drawableStart/drawableEnd/drawableTop/drawableBottom
ui在給我做視覺還原的時候,我常常會被UI懟:為什么這個圖的效果和我給你的不一樣?怎么圖片看起來那么小/大?
復原場景




大概能看出來,100dp的高度能包裹住這張圖片。


為什么?
看到效果對比,大家應該猜得出問題出在哪兒,我有時為了不增大app體積,這些本地圖片我有時候不愿意放 這么多尺寸的圖,就只把 ui切給我的 xhdpi的圖,放在xhdpi文件夾下,甚至有時候把xhdpi的圖放在xxhdpi文件夾下,
這就造成了圖片的縮放問題。
解決方案很好做,按規(guī)范放圖。
原因分析
以drawableStart為例,看在源碼中的實現(xiàn)。
看到TextVIew的構(gòu)造器



我們先來看看setCompoundDrawablesWithIntrinsicBounds方法

最終調(diào)用setCompoundDrawables設置圖片進去,但是未在該方法中有看到縮放的調(diào)用。
可是setBounds方法疑似是設置了大小。

這個方法指定了圖片的大小
而圖片的大小

在代碼中進行驗證

//我是真機測試,真機的屏幕參數(shù)

java代碼的width單位是px。

待測圖寬174px,放在xh,也就是320dpi,對應dp為
174 / (320 / 160)= 87dp(ui標注87dp就能在xh上顯示完全這個圖片)
對應機器的dpi 2.625
自適應(int) 87*2.625 = 228 px
但是如果放錯位置,174px放在hdpi,也就是240dpi
174/ (240/160)= 116dp(需要116dp才能顯示完全,這就造成圖片偏大)自適應過來需要305px
同理,錯放在xxxh 174 /( 640 / 160) = 43.5dp
圖片只需要44dp就能顯示完全,這樣看起來圖片就偏小,塞不滿87dp的空間。
IntrinsicWidth和IntrinsicHeight指定了圖片空間。
參考
AndroidAndroid開發(fā)中dip,dpi,density,px等詳解http://m.itdecent.cn/p/cd66b7e01d4a
UI設計規(guī)范一Android尺寸單位換算及切圖規(guī)范
http://m.itdecent.cn/p/8cdccdd27ede