android:drawableLeft边距和/或填充


Answers:


464

正如cephus所提到android:drawablePadding的,如果按钮足够小,将仅在文本和可绘制对象之间强制填充。

布置较大的按钮时,可以android:drawablePaddingandroid:paddingLeft和结合使用,android: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" />  

21
android:paddingLeft =“ 30dip” android:paddingRight =“ 26dip”是关键!
IgorGanapolsky

4
这与问题无关,但是android:gravity =“ center”将使文本与drawable的中心对齐!
cwhsu 2014年

1
如果我们在左侧和右侧都具有可绘制对象,而只需要调整右侧可绘制对象怎么办?
nmxprime 2014年

我只使用:android:paddingLeft,它会更改图像的位置。android:drawablePadding用于图像和文本之间的空间。
2014年

此代码的问题是,passwordToggleDrawable由于无法将目标仅指定给左可绘制对象,因此导致左填充间隙变大。
水果

184

TextView具有android:drawablePadding属性,该属性应可完成:

android:drawablePadding

可绘制对象和文本之间的填充。

必须是尺寸值,它是一个浮点数,后跟一个单位,例如“ 14.5sp”。可用的单位是:px(像素),dp(与密度无关的像素),sp(基于首选字体大小的缩放像素),(英寸),mm(毫米)。

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

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


61

android:drawablePadding仅当按钮足够小以将2挤压在一起时,才会在文本和可绘制对象之间创建填充间隙。如果按钮的宽度大于组合宽度(对于drawableLeft / drawableRight)或高度(对于drawableTop / drawableBottom),则drawablePadding不会执行任何操作。

我现在也在为此苦苦挣扎。我的按钮很宽,图标挂在按钮的左边缘,文本居中。我目前解决此问题的唯一方法是使用photoshop在画布的左侧边缘添加空白像素,以在可绘制对象上烘烤空白。也不理想,也不建议这么做。但这就是我目前的权宜之计,还没有重建TextView / Button。


感谢您解释我的问题。我还没有意识到这仅是在按钮足够宽时才引起的
peter.bartos

我也有同样的问题。我的按钮很宽,因此可绘制对象与文本不接近
Milad Faridnia

是的,它工作了,谢谢
dave o grady

43

是。如下使用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" />

37

使您的可绘制资源.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
@最优秀的艺术家我在可绘制中使用了inset,它在较新版本的设备上运行良好。我的意思是它不能在SDK 16、17中工作,而可以在SDK 23中工作。有什么想法吗?
Bhavin Chauhan


不错的答案,并为此表示支持。您只是帮助我解决了困扰我很长时间的问题。
Anthonyeef '16

34

android:drawablePadding是对可绘制图标进行填充的最简单方法,但您不能像paddingRightpaddingLeft可绘制图标那样对特定的一侧进行填充。要实现这一点,必须深入研究。如果您将paddingLeftpaddingRight应用于Edittext,则会将填充Edittext与可绘制图标一起放在整个填充上。


12

为您的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的边距。


12

android:drawablePadding是为可绘制图标提供填充的最简单方法,但是您不能给特定的一侧填充(例如可绘制图标的paddingRight或paddingLeft)。要实现此目的,您必须深入研究它。并且,如果将paddingLeft或paddingRight应用于Edittext,则它将填充到整个Edittext以及可绘制图标。

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

您应该使用“ dp”
Mark Pazon

11
<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一个指定的值,填充将测量。


9

我也会把答案也弄响。如果要以编程方式执行此操作,则可以执行以下操作。

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中。


7

而不是Button使用LinearLayoutImageViewTextView内。在儿童用品中喜欢ImageViewTextView使用android:duplicateParentState="true"


实际上,您将需要一个FrameLayout和一个Button(以及它们自己的LinearLayout中的ImageView / TextView)以重现Button UI并将onclicklistener()转移到按钮部分
3c71

1
如果TextView中已经具有drawablePadding,为什么还要使用其他布局。
帕林达·拉贾帕克莎(Painda Rajapaksha),

5

您应该考虑使用图层列表

像这样创建一个可绘制文件,将其命名为ic_calendar.xml

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item>
    <shape android:shape="rectangle">
        <solid android:color="@android:color/transparent"/>
    </shape>
</item>
<item android:right="10dp">
    <bitmap android:gravity="center_vertical|left"
        android:src="@drawable/ic_calendar_16dp"
        android:tint="@color/red"
        />
</item>
</layer-list>

在布局文件下,

<TextView
         android:id="@+id/tvDate"
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
         android:drawableLeft="@drawable/ic_calendar"
         android:textColor="@color/colorGrey"
         android:textSize="14sp" 
    />

4

您可以对按钮使用填充,也可以与drawablePadding一起玩

 <Button
    style="@style/botonesMenu"
    android:padding="15dp"
    android:drawablePadding="-15dp"
    android:text="@string/actualizarBD"
    android:textAlignment="gravity"
    android:gravity="center"
    android:layout_row="1"
    android:layout_column="0"
    android:drawableTop="@drawable/actualizar"
    android:id="@+id/btnActualizar"
    android:onClick="actualizarBD" />

您可以通过android:paddingLeft =“ 10dp”或android:paddingBottom =“ 10dp”或android:paddingRight =“ 10dp”或android:paddingTop =“ 10dp”来使用特定的填充内容


2

您可以使用android:drawableLeft="@drawable/your_icon"设置可绘制对象显示在左侧。为了设置可绘制对象的填充,您应该分别使用android:paddingLeftandroid:paddingRight设置左/右填充。

android:paddingRight="10dp"
android:paddingLeft="20dp"
android:drawableRight="@drawable/ic_app_manager"

1

如果可绘制资源的大小是固定的,则可以这样进行:

<Button
    android:background="@drawable/rounded_button_green"
    style="?android:attr/selectableItemBackground"
    android:layout_height="wrap_content"
    app:layout_widthPercent="70%"
    android:drawableRight="@drawable/ic_clear_black_24dp"
    android:paddingRight="10dp"
    android:paddingLeft="34dp"
    tools:text="example" />

这里的关键是:

    android:drawableRight="@drawable/ic_clear_black_24dp"
    android:paddingRight="10dp"
    android:paddingLeft="34dp"

也就是说,可绘制资源的大小加上paddingRight为paddingLeft。

您可以在此示例中看到结果


1
textView.setCompoundDrawablesWithIntrinsicBounds(AppCompatResources.getDrawable(this,drawable),null,null,null);

addressTitleView.setCompoundDrawablePadding();

尽管此代码段可以解决问题,但提供说明确实有助于提高您的帖子质量。请记住,您将来会为读者回答这个问题,而这些人可能不知道您提出代码建议的原因。
罗萨里奥·佩雷拉·费尔南德斯

这仅适用于文本视图,而不适用于例如按钮,该按钮还允许设置开始/结束可穿戴对象
Ixx

1

只需从:

<?xml version="1.0" encoding="utf-8"?>
<shape
        xmlns:android="http://schemas.android.com/apk/res/android">

    <corners android:radius="40dp"/>

    <solid android:color="@android:color/white"/>

</shape>

<layer-list
        xmlns:android="http://schemas.android.com/apk/res/android">
    <item
            android:right="@dimen/_2dp"
            android:left="@dimen/_2dp"
            android:bottom="@dimen/_2dp"
            android:top="@dimen/_2dp"
            >
        <shape
                xmlns:android="http://schemas.android.com/apk/res/android">

            <corners android:radius="40dp"/>

            <solid android:color="@android:color/white"/>

        </shape>
    </item>

</layer-list>

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.