3

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

<Button
    android:id="@+id/prefButton"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center_horizontal"
    android:text="Edit" />

因为我没有指定和 textSize,所以它采用设备字体设置的默认面。添加按钮的宽度和高度看起来不错。

现在的问题是当我想添加背景图像(实际上是背景颜色但无法获得确切的 argb 值,因此使用图像)时,我添加了:

    android:background="@drawable/backgroundImage"

并且图像大小约为 300x300 像素。因此,现在我得到了大小为 300x300 的按钮(显然)。

所以,现在我必须硬编码高度和宽度的值。并检查这些值是否看起来不错,如果不是,我还必须再次对 TextSize 进行硬编码。

有没有办法让 Button 与以前一样,只需添加背景图像(可能更大)。

谢谢你

4

1 回答 1

3

我能想到的解决您的问题的更好方法是使您的图像更小并将其设置为 9patch 图像,这将使其拉伸以填充文本,就像默认按钮图像一样。在 9patch 图像中,您可以定义图像的拉伸部分,使其在拉伸时不会变形。在这里您可以看到如何绘制九个可拉伸部件。

这是从此处获取的九补丁图像的解释:

Nine-patch NinePatchDrawable 图形是可拉伸的位图图像,Android 会自动调整其大小以适应您将其作为背景放置的 View 的内容。NinePatch 的一个示例使用是标准 Android 按钮使用的背景——按钮必须拉伸以适应各种长度的字符串。NinePatch drawable 是一个标准的 PNG 图像,包括一个额外的 1 像素宽的边框。它必须以扩展名 .9.png 保存,并保存到项目的 res/drawable/ 目录中。

边框用于定义图像的可拉伸和静态区域。您可以通过在边框的左侧和顶部绘制一条(或多条)1 像素宽的黑线来指示可拉伸部分(其他边框像素应完全透明或白色)。您可以拥有任意数量的可拉伸部分:它们的相对大小保持不变,因此最大的部分始终保持最大。

您还可以通过在右边和底线上绘制一条线来定义图像的可选可绘制部分(实际上是填充线)。如果 View 对象将 NinePatch 设置为其背景,然后指定 View 的文本,它会自行拉伸,以使所有文本仅适合右线和底线指定的区域(如果包括)。如果不包括填充线,Android 使用左边和顶线来定义这个可绘制区域。

为了阐明不同线条之间的区别,左侧和顶部的线条定义了允许复制图像的哪些像素以拉伸图像。底部和右侧的线定义了允许视图内容位于图像内的相对区域。

这是一个用于定义按钮的示例 NinePatch 文件:

按钮九补丁

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

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

于 2012-09-21T11:13:19.547 回答