Android:如何将背景图像设置为给定 "wrap_content"的按钮

标签 android button background

首先我有一个这样的按钮:

<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 文件:

Button NinePatch

这个 NinePatch 定义了一个带有左线和顶线的可拉伸(stretch)区域以及带有底线和右线的可绘制区域。在顶部图像中,灰色虚线标识将被复制以拉伸(stretch)图像的图像区域。底部图像中的粉红色矩形标识允许 View 内容的区域。如果内容不适合该区域,则图像将被拉伸(stretch)以适应。

Draw 9-patch 工具提供了一种非常方便的方法来使用 WYSIWYG 图形编辑器创建 NinePatch 图像。如果您为可拉伸(stretch)区域定义的区域由于像素复制而面临产生绘图伪影的风险,它甚至会发出警告。

关于Android:如何将背景图像设置为给定 "wrap_content"的按钮,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12529285/

相关文章:

java - 如何让 fragment A 知道 fragment B 中的按钮已按下

java - android 创建项目操作期间无法识别目标 ID

swift - 按下时更改按钮标签/文本

android - 为具有可绘制形状的 EditText View 设置样式,使其看起来类似于 Android < 3.0 的新全息主题

android - 通过单击按钮更改 Android SDK 中的背景颜色不起作用

c# - 如何更改 TabControl.Header 的背景颜色

android - 如何检查我的小部件屏幕何时像 Android 中的 onResume 一样在 flutter 中可见

android - Firebase版本与支持库冲突

ios - 将自定义 UIBarButtonItem 添加到 UINavigationBar

button - OpenLayers.Control.Button 的触发参数不会被调用