android:drawablePadding的一个坑

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应该与此类似。


文本的绘制代码过于复杂,没有找到计算位置的准确代码,欢迎补充,拍砖!


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值