【问题标题】:Android: How to set a background image to a button which is given "wrap_content"Android:如何将背景图像设置为给定“wrap_content”的按钮
【发布时间】:2012-09-21 11:04:46
【问题描述】:

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

<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 和以前一样,只添加背景图片(可能更大)。

谢谢

【问题讨论】:

标签: android button background


【解决方案1】:

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

这里解释一下什么是ninepatch 图像,取自here

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

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

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

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

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

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

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

【讨论】:

  • 不客气,尽量让答案完整
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-09-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多