在布局中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在左。可以看这个解释。
<TextView android:text="Text along with Image\nsecond\nthird\nforth\nfifth" android:layout_width="400dip"
android:layout_height="wrap_content"
android:drawableStart="@drawable/ic_launcher"
android:drawableLeft="@drawable/ic_launcher"
android:textSize="16sp"
android:paddingTop="10dip"
android:paddingBottom="10dip"
android:paddingLeft="10dip"
android:gravity="center"
android:drawablePadding="5dip"/>;
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或者一些巨复杂的应用,就会带来明显的收益。还有,汇集小溪而成大河,把所有小的点都优化到了极致,那么整体肯定会得到质的飞跃。
学无止境,技术上的优化也无止境啊!把事情做到极致应是工程师追求的目标!
欢迎搜索并关注 公众号「稀有猿诉」 获取更多的优质文章!
保护原创,请勿转载!