android: drawablleft边距和/或填充

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

297021 次浏览

TextView有一个android: drawablePadding属性,它应该做的技巧:

android: drawablePadding

绘图和文本之间的填充。

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

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

这对应于全局属性资源符号 drawablePadding . < / p >

android:drawablePadding只会在文本和可绘制对象之间创建一个填充间隙,如果按钮足够小,可以将两者挤在一起。如果你的按钮比组合宽度(用于drawablleft /drawableRight)或高度(用于drawableTop/drawableBottom)更宽,那么drawablePadding不会做任何事情。

我现在也在为这个问题挣扎。我的按钮很宽,图标挂在按钮的左边缘,文本在中间居中。我唯一的方法来解决这个问题,现在已经烘焙在可绘制的边缘,通过添加空白像素到画布的左边缘用photoshop。不理想,也不推荐。但这是我目前的权宜之计,短的重建TextView/按钮。

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

使用包含ImageViewTextViewLinearLayout代替Button。在像ImageViewTextView这样的子项中使用android:duplicateParentState="true"

尝试使用负填充

如:

android:paddingLeft="-8dp"
为你的编辑文本定义一个形状,并给它一个填充 例如< / p >
<?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>
在此形状中定义的填充将帮助为可绘制的左侧或右侧提供填充 ---------------------- 应用这种形状EditView < / p >
 <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一些风格加上边框drawablleft。

创建可绘制的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>
android:drawablePadding是为可绘制图标提供填充的最简单方法,但你不能为可绘制图标提供特定的一侧填充,如paddingRightpaddingLeft。要做到这一点,你必须深入研究。 如果你将paddingLeftpaddingRight应用于Edittext,那么它将对整个Edittext以及可绘制的图标进行填充

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

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

你可以为按钮使用填充,你可以使用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: paddinggright ="10dp"或android:paddingTop="10dp"

如果可绘制资源的大小是固定的,你可以这样做:

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

您可以在本例中看到结果

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

你应该考虑使用图层列表

创建一个这样的可绘制文件,将其命名为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"
/>
textView.setCompoundDrawablesWithIntrinsicBounds(AppCompatResources.getDrawable(this,drawable),null,null,null);


addressTitleView.setCompoundDrawablePadding();

我也会把我的答案扔到擂台上。如果您希望以编程方式完成此操作,可以执行以下操作。

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。

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

重新制作:

<?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>

根据@Bhargav Thanki:

android:drawablePadding是最简单的方法 可绘制图标,但你不能给特定的一侧填充像 可绘制图标的paddingRightpaddingLeft。为了实现这个目标 必须深入调查。如果你应用paddingLeftpaddingRight EditText,然后它将沿着整个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"/>

另一个简单的解决方案可以通过嵌入layerlist实现

layered_drawable

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
<item>
<inset
android:insetRight="30dp"
android:drawable="@drawable/ic_air_date">
</inset>
</item>
</layer-list>

XML中的按钮

<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:drawableLeft="@drawable/layered_drawable"
android:text="something" />