在APP开发过程中,我们会进行一些性能上的优化,比如布局上,当想实现文字旁边有个图片的效果,
谷歌官方建议不要用
TextView+ImageView+外部裹一层布局的方法,
而推荐使用TextView的方法
drawableStart/drawableEnd/drawableTop/drawableBottom
ui在给我做视觉还原的时候,我常常会被UI怼:为什么这个图的效果和我给你的不一样?怎么图片看起来那么小/大?
复原场景




大概能看出来,100dp的高度能包裹住这张图片。


为什么?
看到效果对比,大家应该猜得出问题出在哪儿,我有时为了不增大app体积,这些本地图片我有时候不愿意放 这么多尺寸的图,就只把 ui切给我的 xhdpi的图,放在xhdpi文件夹下,甚至有时候把xhdpi的图放在xxhdpi文件夹下,
这就造成了图片的缩放问题。
解决方案很好做,按规范放图。
原因分析
以drawableStart为例,看在源码中的实现。
看到TextVIew的构造器



我们先来看看setCompoundDrawablesWithIntrinsicBounds方法

最终调用setCompoundDrawables设置图片进去,但是未在该方法中有看到缩放的调用。
可是setBounds方法疑似是设置了大小。

这个方法指定了图片的大小
而图片的大小

在代码中进行验证

//我是真机测试,真机的屏幕参数

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开发中dip,dpi,density,px等详解http://www.jianshu.com/p/cd66b7e01d4a
UI设计规范一Android尺寸单位换算及切图规范
http://www.jianshu.com/p/8cdccdd27ede