Android:drawableLeft 的边距和/或填充

435

在使用android:drawableLeft添加图片后,是否可以为该图片设置边距或填充?

20个回答

518

正如 cephus 所提到的,android:drawablePadding 只会在按钮足够小的情况下强制在文本和图标之间添加填充。

当布局较大的按钮时,您可以同时使用 android:drawablePaddingandroid:paddingLeftandroid:paddingRight 来将文本和图标向内推进到按钮的中心。通过分别调整左右填充,您可以对布局进行非常详细的调整。

下面是一个示例按钮,它使用填充将文本和图标推得比默认情况下更接近:

<Button android:text="@string/button_label" 
    android:id="@+id/buttonId"
    android:layout_width="160dip"
    android:layout_height="60dip"
    android:layout_gravity="center"
    android:textSize="13dip"
    android:drawableLeft="@drawable/button_icon"
    android:drawablePadding="2dip"
    android:paddingLeft="30dip"
    android:paddingRight="26dip"
    android:singleLine="true"
    android:gravity="center" />  

28
android:paddingLeft="30dip" android:paddingRight="26dip" 在这里是关键! - IgorGanapolsky
7
这与问题无关,但是 android:gravity="center" 可以使文本与图像的中心对齐! - cwhsu
2
如果我们在左右两侧都有可绘制对象,而只需要调整右侧的可绘制对象怎么办? - nmxprime
1
我只使用android:paddingLeft,它可以改变图像的位置。android:drawablePadding用于图像和文本之间的间距。 - Brave
1
这段代码的问题在于它无法仅针对左侧可绘制对象进行特定目标,因此导致passwordToggleDrawable的左填充间隙变大。 - 林果皞

210

TextView有一个android:drawablePadding属性,可以解决问题:

android:drawablePadding

绘图和文本之间的填充。

必须是一个尺寸值,这是一个浮点数加上单位,例如"14.5sp"。可用的单位有:px(像素),dp(密度无关像素),sp(基于首选字体大小缩放的像素),in(英寸),mm(毫米)。

这也可以是一个资源引用(形式为"@ [package:]type:name")或主题属性(形式为"?[package:][type:]name")包含此类型的值。

这对应于全局属性资源符号drawablePadding。


69

android:drawablePadding 只有在按钮的宽度(对于 drawableLeft/drawableRight)或高度(对于 drawableTop/drawableBottom)小到足以将两者挤在一起时,才会在文本和图标之间创建填充间隙。 如果按钮比合并后的宽度或高度还要宽,则 drawablePadding 不起作用。

我现在也在苦恼这个问题。 我的按钮非常宽,图标挂在按钮的左边缘,文本位于中间。 目前,我的唯一解决办法是通过在Photoshop中向画布左侧添加空白像素来制作图标边缘的边距。 这不是理想的解决方案,也不建议采用。 但这是我目前的权宜之计,除了重建 TextView/Button 以外没有其他解决方法。


感谢您解释我的问题。我没有意识到这只有在按钮足够宽时才会引起问题。 - peter.bartos
我有同样的问题。我的按钮很宽,所以可绘制对象与文本不接近。 - Milad Faridnia

50

是的,使用 drawablePadding 如下:

<TextView
        android:id="@+id/tvHeader"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Settings and Contents"
        android:drawableLeft="@drawable/icon_success"
        android:drawablePadding="10dp" />

我该如何在drawableLeft项目中编写单独的onclick事件? - sejn

43

创建可绘制资源的.xml文件

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_checked="true">
        <inset android:drawable="@drawable/small_m" android:insetLeft="10dp" android:insetTop="10dp" />
    </item>
    <item>
        <inset android:drawable="@drawable/small_p" android:insetLeft="10dp" android:insetTop="10dp" />
    </item>
</selector>

2
@最好的艺术家,我已经在drawable中使用了inset,并且在新版本设备上运行良好。我的意思是它在SDK 16、17上无法工作,但在SDK 23上可以工作。有什么想法吗? - Bhavin Chauhan
2
http://developer.android.com/reference/android/graphics/drawable/InsetDrawable.html 它来自API 1 - Bhavin Chauhan
很好的答案,点个赞!你刚帮我解决了一个困扰我很久的问题。 - Anthonyeef

39

android:drawablePadding 是给 drawable 图标添加内边距最简单的方法,但是您不能像给 drawable 图标设置 paddingRightpaddingLeft 那样设置特定的一侧内边距。要实现这一点,您需要深入了解它。 如果您对 Edittext 应用 paddingLeftpaddingRight,那么它会在整个 Edittext 包括 drawable 图标上放置内边距。


30

根据@Bhargav Thanki的说法:

android:drawablePadding是给绘制图标添加填充的最简单方法,但您无法像paddingRightpaddingLeft一样为绘制图标的特定一侧提供填充。要实现这一点,您需要深入研究它。如果您对EditText应用paddingLeftpaddingRight,则它将在整个EditText中放置填充和绘制图标。

例如:

    <TextView 
        android:layout_width="match_parent"
        android:padding="5dp"
        android:id="@+id/date"
        android:gravity="center|start"
        android:drawableEnd="@drawable/ic_calendar"
        android:background="@drawable/edit_background"
        android:hint="Not Selected"
        android:drawablePadding="10dp"
        android:paddingStart="10dp"
        android:paddingEnd="10dp"
        android:textColor="@color/black"
        android:layout_height="wrap_content"/>

1
这是图标和文本之间的填充,但是在EditText开始和Drawable开始之前的填充呢? - user924

15

为您的EditText定义一个形状并给它添加填充,例如:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle" >
    <padding
        android:left="5dp"
        android:right="5dp"
    />
    <solid android:color="#F6F6F6" />
    <stroke
        android:width="1px"
        android:color="#C3C3C3" />

    <corners
        android:bottomLeftRadius="1dp"
        android:bottomRightRadius="1dp"
        android:topLeftRadius="1dp"
        android:topRightRadius="1dp" />
</shape>

这个形状定义的填充将有助于给drawableleft或right提供填充。

---------------------- 将此形状应用于EditView上。

 <EditText
            android:id="@+id/example"
            android:layout_width="fill_parent"
            android:layout_height="36dp"
            android:layout_marginLeft="10dp"
            android:layout_marginRight="10dp"
            android:background="@drawable/shape2"
            android:drawableLeft="@drawable/icon1"
            android:drawablePadding="@dimen/txtDrwblPadding"
            android:ems="10"
         />

使用定义的形状作为背景,将为您的EditText添加一些样式和对drawableLeft的边距。

14
<TextView
    android:layout_width="wrap_content"
    android:layout_height="32dp"
    android:background="@drawable/a"
    android:drawableLeft="@drawable/concern_black"
    android:gravity="center"
    android:paddingLeft="10dp"
    android:paddingRight="10dp"
    android:drawablePadding="10dp"
    android:text="text"/>

注意:layout_width需要设置为wrap_content,并使用paddingLeft、paddingRight和drawablePadding来控制间隔。如果您指定了layout_width值,那么图标和文本之间将会有间隔。我认为一旦给layout_width指定一个具体的值,padding就会进行测量。


12

我也想发表我的看法。如果您想以编程的方式实现此操作,可以执行以下操作。

final Drawable drawable = ContextCompat.getDrawable(getContext(), R.drawable.somedrawable);
final boolean isLTR = ViewCompat.LAYOUT_DIRECTION_LTR == ViewCompat.getLayoutDirection(this);
final int iconInsetPadding = getResources().getDimensionPixelSize(R.dimen.icon_padding);

final Drawable insetDrawable = new InsetDrawable(drawable, isLTR ? 0 : iconInsetPadding, 0, isLTR ? iconInsetPadding : 0, 0);
这将在可绘制对象的末尾添加填充,其中“末尾”表示左侧/右侧(取决于手机是否处于LTR或RTL状态)。

仅支持 API 26 及以上版本。 - Aura Lee

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接