在布局中Icon+文字组成一个视觉上的元素是非常普遍的需求,或者是成为一个可点击的整体,或者是展示某种信息。比如顶部导航栏(ActionBar或者是自已定义实现的类似功能的)都会有一个返回,通常都是一个向左的Icon加上一个文字标签。
这种需求实现起来也是非常的简单,初学安卓的同学也能很快的写出来,一个ImageView加上一个TextView,外面再包一层LinearLayout或者RelativeLayout。Okay,这没有问题,但有更好的实现方式,这需要三个View对象,一个外层group,一个ImageView一个TextView,可以仅使用一个TextView对象,达到同样的效果。
TextView的drawable属性
TextView有一些属性可以在Text的四周设置一个drawable对象,图片,shape等合法的drawable都可以用。
- drawableStart API 14才有
- drawableLeft
- drawableTop
- drawableBottom
- drawableRight
- drawableEnd API 14才有
- drawablePadding 用以设置drawable与text之间的空间
它们的含义就像其名字所暗示的那样,left/top/right/bottom就是在文字的上下左右放置drawable。而drawableStart和drawableEnd则有特殊的意义,虽然它们是API 14加上去的,但是要在API 17后才能真正的生效,它们的作用是当语言方向发生变化时,会换边,LTR语言drawableStart在左边,而drawableEnd在右边;但对于RTL语言来说就会反过来drawableStart在右,drawableEnd在左。可以看这个解释。
1 2 3 4 5 6 7 8 9 10 |
|
TextView的drawable的一些注意事项
- TextView的padding作用在drawable之外
- TextView的高度或宽度为wrap_content时将是文字和drawable中较大的那一个,再加上padding和margin
- gravity只对文字起作用,对drawable不起作用
- drawable会在其所在的维度居中显示,比如drawableLeft是上下垂直居中的,以此类推
局限性
有些时候它也有一些局限性而没有办法用它:
- 当drawable本身没有高度时(比如shape),这个drawable高度就会依赖于文字,因为padding是加在drawable之外,所以只会依赖于文字的高度。有些时候这不是想要的结果。
- 当Icon需要与文字分开单独控制时,很显示这要分成二个View。
- 当需要对Icon进行特殊的个性化时,比如添加背景,特效等。
- 其他一些造成无法使用的。
- 除上述情况外,就要考虑使用drawable了。
why bother?
有同学可能会问,有什么区别,为啥费这么大劲折腾,也就省了二个view对象而已嘛?这位同学可以坐下了,孤来说明下:首先,作为开发者要有永不止境的学习和优化的意识,即使带来的效果是微小的,能用一个对象搞定的,为啥用三个呢?其次,对于整体不复杂的页面,这样带来的效果确实不明显,但是对于超复杂的页面,页面的布局有上百个View时,比如Launcher或者淘宝系的应用,就会带来明显的收益。还有,汇集小溪而成大河,把所有小的点都优化到了极致,那么整体肯定会得到质的飞跃。
子曰:学无止境,技术和优化也无止境啊,各位同学可以多用用Google系的应用,以及国外的优质应用(Facebook, Twitter等),你会发现,虽然应用也很复杂,比如Google+它的页面里展示的元素也非常多,但是为什么用起来是那么流畅。就在于Google里的Android开发都是专家级的人物,他们牛在什么地方,就牛在他们总能用最好的方式来实现,就在于他们总能找到一个对象就能解决我们靠三个对象才能搞定的方法。