首先我有一个这样的按钮:
<Button
android:id="@+id/prefButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:text="Edit" />
因为我没有指定和 textSize,它采用设备字体设置的默认边。甚至添加 Button 的宽度和高度看起来也不错。
现在的问题是当我想添加背景图像(实际上是背景颜色但无法获得准确的 argb 值,因此使用图像)时,我添加了:
android:background="@drawable/backgroundImage"
图像大小约为 300x300 像素。因此,现在我得到了大小为 300x300 的按钮(显然)。
所以,现在我必须对高度和宽度的值进行硬编码。并检查它是否符合这些值,如果不符合,我还必须再次对 TextSize 进行硬编码。
有没有办法让 Button 和以前一样,只添加一个背景图像(可能更大)。
谢谢
最佳答案
我能想到的解决问题的更好方法是缩小图像并将其设置为 9patch 图像,这将使其像默认按钮图像一样拉伸(stretch)以填充文本。在 9patch 图像中,您可以定义图像的拉伸(stretch)部分,这样它在拉伸(stretch)时就不会变形。 Here你可以看到如何绘制一个 ninepatch 可拉伸(stretch)部件。
这里解释了什么是 ninepatch 图像,取自 here :
九补丁 NinePatchDrawable 图形是可拉伸(stretch)的位图图像,Android 会自动调整其大小以适应您将其作为背景放置在其中的 View 的内容。 NinePatch 的一个使用示例是标准 Android 按钮使用的背景——按钮必须拉伸(stretch)以适应各种长度的字符串。 NinePatch 可绘制对象是一个标准的 PNG 图像,其中包含一个额外的 1 像素宽的边框。它必须以扩展名 .9.png 保存,并保存到项目的 res/drawable/目录中。
边框用于定义图像的可拉伸(stretch)和静态区域。您通过在边框的左侧和顶部绘制一条(或多条)1 像素宽的黑线(其他边框像素应完全透明或白色)来指示可拉伸(stretch)部分。您可以拥有任意数量的可拉伸(stretch)部分:它们的相对大小保持不变,因此最大的部分始终保持最大。
您还可以通过在右侧和底部画一条线来定义图像的可选可绘制部分(实际上是填充线)。如果 View 对象将 NinePatch 设置为其背景,然后指定 View 的文本,它将自行拉伸(stretch),以便所有文本仅适合右线和底线(如果包含)指定的区域。如果不包含填充线,Android 将使用左侧和顶部的线来定义此可绘制区域。
为了阐明不同行之间的区别,左侧和顶部的行定义了允许复制图像的哪些像素以拉伸(stretch)图像。底线和右线定义图像中的相对区域,允许 View 的内容位于其中。
下面是一个用于定义按钮的示例 NinePatch 文件:
这个 NinePatch 定义了一个带有左线和顶线的可拉伸(stretch)区域以及带有底线和右线的可绘制区域。在顶部图像中,灰色虚线标识将被复制以拉伸(stretch)图像的图像区域。底部图像中的粉红色矩形标识允许 View 内容的区域。如果内容不适合该区域,则图像将被拉伸(stretch)以适应。
Draw 9-patch 工具提供了一种非常方便的方法来使用 WYSIWYG 图形编辑器创建 NinePatch 图像。如果您为可拉伸(stretch)区域定义的区域由于像素复制而面临产生绘图伪影的风险,它甚至会发出警告。
关于Android:如何将背景图像设置为给定 "wrap_content"的按钮,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12529285/