android:drawableLeft边距和/或填充

问题描述 投票:335回答:18

是否可以设置我们使用android:drawableLeft添加的图像的边距或填充?

android android-layout android-drawable
18个回答
431
投票

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

当布置较大的按钮时,您可以使用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" />  

6
投票

我也会把我的答案扔进戒指。如果要以编程方式执行此操作,可以执行以下操作。

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);

这会将填充添加到drawable的末尾,其中end将表示左/右,具体取决于手机是否处于LTR或RTL中。


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" />

你可以使用一个特定的填充取决于你的drawable,用android:paddingLeft =“10dp”或android:paddingBottom =“10dp”或android:paddingRight =“10dp”或android:paddingTop =“10dp”


4
投票

您应该考虑使用layer-list

像这样创建一个可绘制文件,将其命名为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" 
    />

3
投票

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"/>

2
投票

您可以使用android:drawableLeft="@drawable/your_icon"将drawable设置为显示在左侧。为了设置drawable的填充,你应该使用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。

You can see the result in this example


0
投票
textView.setCompoundDrawablesWithIntrinsicBounds(AppCompatResources.getDrawable(this,drawable),null,null,null);

addressTitleView.setCompoundDrawablePadding();

0
投票

刚重拍:

<?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/xxxs"
            android:left="@dimen/xxxs"
            android:bottom="@dimen/xxxs"
            android:top="@dimen/xxxs"
            >
        <shape
                xmlns:android="http://schemas.android.com/apk/res/android">

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

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

        </shape>
    </item>

</layer-list>

-4
投票

尝试使用负填充

喜欢:

android:paddingLeft="-8dp"

168
投票

TextView有一个android:drawablePadding属性应该可以解决这个问题:

机器人:drawablePadding

drawables和文本之间的填充。

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

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

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


56
投票

android:drawablePadding只会在文本和drawable之间创建填充间隙,如果按钮小到足以将2压缩在一起。如果您的按钮宽度超过组合宽度(对于drawableLeft / drawableRight)或高度(对于drawableTop / drawableBottom),则drawablePadding不会执行任何操作。

我现在也在努力解决这个问题。我的按钮非常宽,图标悬挂在按钮的左边缘,文本居中于中间。我现在解决这个问题的唯一方法就是通过在photoshop的画布左边缘添加空白像素来在可绘制的边缘烘烤。不理想,也没有真正推荐。但这就是我现在的止损解决方案,没有重建TextView / Button。


40
投票

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

32
投票

制作drawable resources.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>

32
投票

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


7
投票
<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将测量。


7
投票

而不是Button使用LinearLayoutImageViewTextView里面。在像ImageViewTextView这样的儿童用品中使用android:duplicateParentState="true"

© www.soinside.com 2019 - 2024. All rights reserved.