TextView,DrawableStartXX图片变大或变小

在APP开发过程中,我们会进行一些性能上的优化,比如布局上,当想实现文字旁边有个图片的效果,
谷歌官方建议不要用
TextView+ImageView+外部裹一层布局的方法,
而推荐使用TextView的方法
drawableStart/drawableEnd/drawableTop/drawableBottom

ui在给我做视觉还原的时候,我常常会被UI怼:为什么这个图的效果和我给你的不一样?怎么图片看起来那么小/大?

复原场景

被测图片属性
待测机型屏幕信息
布局很简单
图片放在xhdpi的文件夹下的效果

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

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

为什么?

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

原因分析

以drawableStart为例,看在源码中的实现。
看到TextVIew的构造器

TextView构造器
拿到xml的属性设置drawableStart
使用drawable

我们先来看看setCompoundDrawablesWithIntrinsicBounds方法

setCompoundDrawablesWithIntrinsicBounds

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

实际设置图片大小的setBounds方法

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

getIntrinsicWidth的解释

在代码中进行验证


打印代码

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

打印结果

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开发中dip,dpi,density,px等详解http://www.jianshu.com/p/cd66b7e01d4a

UI设计规范一Android尺寸单位换算及切图规范
http://www.jianshu.com/p/8cdccdd27ede

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容