TextView,DrawableStartXX圖片變大或變小

在APP開發(fā)過程中,我們會進行一些性能上的優(yōu)化,比如布局上,當想實現(xiàn)文字旁邊有個圖片的效果,
谷歌官方建議不要用
TextView+ImageView+外部裹一層布局的方法,
而推薦使用TextView的方法
drawableStart/drawableEnd/drawableTop/drawableBottom

ui在給我做視覺還原的時候,我常常會被UI懟:為什么這個圖的效果和我給你的不一樣?怎么圖片看起來那么小/大?

復原場景

被測圖片屬性
待測機型屏幕信息
布局很簡單
圖片放在xhdpi的文件夾下的效果

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

圖片放在mdpi的效果
圖片放在xxxhdpi的效果

為什么?

看到效果對比,大家應該猜得出問題出在哪兒,我有時為了不增大app體積,這些本地圖片我有時候不愿意放 這么多尺寸的圖,就只把 ui切給我的 xhdpi的圖,放在xhdpi文件夾下,甚至有時候把xhdpi的圖放在xxhdpi文件夾下,
這就造成了圖片的縮放問題。
解決方案很好做,按規(guī)范放圖。

原因分析

以drawableStart為例,看在源碼中的實現(xiàn)。
看到TextVIew的構(gòu)造器

TextView構(gòu)造器
拿到xml的屬性設置drawableStart
使用drawable

我們先來看看setCompoundDrawablesWithIntrinsicBounds方法

setCompoundDrawablesWithIntrinsicBounds

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

實際設置圖片大小的setBounds方法

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

getIntrinsicWidth的解釋

在代碼中進行驗證


打印代碼

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

打印結(jié)果

java代碼的width單位是px。

dpi

待測圖寬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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容