Android的TextView是一个强大的widget,它的其中一个特性是支持在文本的周围设置icon。
如以下这样的效果:
TextView允许在文本的上下左右放置icon,也可以设置icon和文本之间的距离。
设置icon的相关接口为:
setCompoundDrawables开头的一系列接口,
其中设置icon和文本距离的接口为: void setCompoundDrawablePadding (int pad)
经过demo验证和查看部分源代码,发现setCompoundDrawablePadding之后的效果并不总是和预期的相符。
比如:
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
tools:context="com.example.testtextview.MainActivity">
<TextView
android:id="@+id/testText"
android:layout_width="300dp"
android:layout_height="wrap_content"
android:gravity="center"
android:drawableLeft="@drawable/ic_launcher"
android:drawablePadding="0dp"
android:text="@string/hello_world"/>
</FrameLayout>
对应的效果为:
在Layout文件中设置的padding为0,预期效果是文字紧挨着icon,实际结果是icon和文字之间有大段距离。
如果将TextVIew的layout_width属性修改为"wrap_content",其它的不变,则可以得到以下效果:
或者将TextView的gravity的改为"left|center_vertical",其它的不变,则可以得到以下效果:
经过多次修改参数的验证,发现以下规律:
left icon的位置始终在整个TextView的左边,文本的位置首先考虑TextView的宽度及gravity。
查看TextView的绘制left icon的代码:
可以看到canvas在X轴上偏移的位置与setCompoundDrawablePadding无关,只与滚动的距离和TextView本身的left padding有关,这也验证了以上想法。
因此,当需要指定icon和文本之间特定的距离时,不能只是setCompoundDrawablePadding,还要考虑整个TextView的宽度及gravity。
以上讨论的只是left icon,其它位置的icon应该与此类似。
文本的绘制代码过于复杂,没有找到计算位置的准确代码,欢迎补充,拍砖!