android:drawableLeft margin 和/或 padding
Posted
技术标签:
【中文标题】android:drawableLeft margin 和/或 padding【英文标题】:android:drawableLeft margin and/or padding 【发布时间】:2011-03-21 05:23:20 【问题描述】:是否可以为我们使用android:drawableLeft
添加的图像设置边距或填充?
【问题讨论】:
【参考方案1】:TextView 有一个 android:drawablePadding 属性应该可以解决问题:
android:drawablePadding
可绘制对象和文本之间的填充。
必须是维度值,是附加的浮点数 带有诸如“14.5sp”之类的单位。可用单位有:px(像素)、dp (与密度无关的像素),sp(基于首选的缩放像素 字体大小)、in(英寸)、mm(毫米)。
这也可能是对资源的引用(形式为 “@[package:]type:name”)或主题属性(形式为 "?[package:][type:]name") 包含此类型的值。
这个对应全局属性资源符号 drawablePadding。
【讨论】:
【参考方案2】:android:drawablePadding
只会在按钮小到足以将 2 压在一起时在文本和可绘制对象之间创建填充间隙。如果您的按钮比组合宽度(对于 drawableLeft/drawableRight)或高度(对于 drawableTop/drawableBottom)宽,那么 drawablePadding 不会做任何事情。
我现在也在为此苦苦挣扎。我的按钮很宽,图标挂在按钮的左边缘,文本居中。我目前解决这个问题的唯一方法是通过使用 Photoshop 在画布的左边缘添加空白像素来烘烤可绘制对象的边距。不理想,也不是很推荐。但这是我目前的权宜之计,没有重建 TextView/Button。
【讨论】:
感谢您解释我的问题。我还没有意识到它只是在按钮足够宽时引起的 我也有同样的问题。我的按钮很宽,所以drawable不靠近文本【参考方案3】:正如 cephus 提到的,android:drawablePadding
只会在按钮足够小的情况下强制在文本和可绘制对象之间进行填充。
当布置较大的按钮时,您可以将android:drawablePadding
与android:paddingLeft
和android:paddingRight
结合使用,以强制文本和可绘制对象向内靠近按钮的中心。通过分别调整左右填充,您可以对布局进行非常详细的调整。
这是一个示例按钮,它使用填充将文本和图标推到比默认情况下更近的位置:
<Button android:text="@string/button_label"
android:id="@+id/buttonId"
android:layout_
android:layout_
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" />
【讨论】:
android:paddingLeft="30dip" android:paddingRight="26dip" 是这里的关键! 这与问题无关,但 android:gravity="center" 将使文本与drawable的中心对齐! 如果我们在左右两边都有drawable,只需要调整右drawable怎么办?? 我只使用:android:paddingLeft,它改变了图像的位置。 android:drawablePadding 用于图像和文本之间的空间。 这段代码的问题是它导致passwordToggleDrawable
左填充间隙变大,因为它不能只针对左可绘制对象。【参考方案4】:
而不是 Button
使用 LinearLayout
和 ImageView
和 TextView
在里面。在ImageView
和TextView
等子项中使用android:duplicateParentState="true"
。
【讨论】:
您实际上需要一个 FrameLayout 和一个 Button(以及它们自己的 LinearLayout 中的 ImageView/TextView)来重现 Button UI 并将 onclicklistener() 转移到按钮部分 如果 TextView 中已经有 drawablePadding,为什么还要使用额外的布局。【参考方案5】:尝试使用负填充
喜欢:
android:paddingLeft="-8dp"
【讨论】:
【参考方案6】:为你的编辑文本定义一个形状并给它一个填充 例如
<?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:
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_
android:layout_
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】:制作你的可绘制资源.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>
【讨论】:
@ The Finest Artist 我在 drawable 中使用了插图,它适用于较新版本的设备。我的意思是它不在 SDK 16、17 中工作,但在 SDK 23 中工作。有什么想法吗? developer.android.com/reference/android/graphics/drawable/… 来自 API 1 不错的答案并为此投票。你只是帮我解决了一个困扰我很久的问题。【参考方案8】:android:drawablePadding
是为可绘制图标提供填充的最简单方法,但您不能为可绘制图标提供特定的一侧填充,例如 paddingRight
或 paddingLeft
。要实现这一点,您必须深入研究它。
如果您将paddingLeft
或paddingRight
应用到Edittext
,那么它将填充整个Edittext
以及可绘制图标。
【讨论】:
【参考方案9】:您可以使用android:drawableLeft="@drawable/your_icon"
将drawable 设置为显示在左侧。为了给drawable设置一个内边距,你应该使用android:paddingLeft
或android:paddingRight
分别设置左/右内边距。
android:paddingRight="10dp"
android:paddingLeft="20dp"
android:drawableRight="@drawable/ic_app_manager"
【讨论】:
【参考方案10】:您可以为按钮使用填充,您可以使用 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"
【讨论】:
【参考方案11】:如果drawable资源的大小是固定的,你可以这样做:
<Button
android:background="@drawable/rounded_button_green"
style="?android:attr/selectableItemBackground"
android:layout_
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"
即drawable资源加上paddingRight的大小就是paddingLeft。
You can see the result in this example
【讨论】:
【参考方案12】:是的。如下使用drawablePadding,
<TextView
android:id="@+id/tvHeader"
android:layout_
android:layout_
android:text="Settings and Contents"
android:drawableLeft="@drawable/icon_success"
android:drawablePadding="10dp" />
【讨论】:
你好,我可以在 drawableLeft 项目中编写单独的 onclick 事件【参考方案13】:你应该考虑使用层列表
像这样创建一个可绘制文件,将其命名为 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_
android:layout_
android:drawableLeft="@drawable/ic_calendar"
android:textColor="@color/colorGrey"
android:textSize="14sp"
/>
【讨论】:
【参考方案14】:textView.setCompoundDrawablesWithIntrinsicBounds(AppCompatResources.getDrawable(this,drawable),null,null,null);
addressTitleView.setCompoundDrawablePadding();
【讨论】:
虽然这段代码 sn-p 可以解决问题,但including an explanation 确实有助于提高帖子的质量。请记住,您是在为将来的读者回答问题,而这些人可能不知道您提出代码建议的原因。 这仅适用于文本视图而不是例如按钮也允许设置开始/结束 drwables【参考方案15】:我也会把我的答案扔进戒指。如果您想以编程方式执行此操作,可以执行以下操作。
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);
这会将填充添加到可绘制对象的末尾,其中 end 表示左/右,具体取决于手机是 LTR 还是 RTL。
【讨论】:
这只是 API 26+。【参考方案16】:<TextView
android:layout_
android:layout_
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 一个指定值,填充就会测量。
【讨论】:
【参考方案17】:只是重制:
<?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>
【讨论】:
【参考方案18】:android:drawablePadding
是为可绘制图标提供填充的最简单方法,但您不能为可绘制图标提供特定的一侧填充,例如 paddingRight
或 paddingLeft
。要实现这一点,您必须深入研究它。如果您将paddingLeft
或paddingRight
应用到EditText
,那么它将填充整个EditText
以及可绘制的图标。
<TextView android:layout_
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_/>
【讨论】:
是图标和文本之间的填充,但是edittext开始和drawable开始之前的填充呢?【参考方案19】:另一种简单的解决方案可以通过 inset 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_
android:layout_
android:drawableLeft="@drawable/layered_drawable"
android:text="something" />
【讨论】:
以上是关于android:drawableLeft margin 和/或 padding的主要内容,如果未能解决你的问题,请参考以下文章