【问题标题】:Hide a 1px margin when displaying a png显示 png 时隐藏 1px 边距
【发布时间】:2013-05-15 14:29:45
【问题描述】:

我正在从服务器接收九个补丁图像以显示在我的 Android 应用程序的 UI 中。这是一个硬性要求,所以我无法将九个补丁编译到 APK 中。看起来 Android 将识别任何 PNG 并将其显示为九个补丁,这意味着图像的拉伸遵循外部像素指示的轮廓。问题是Android仍然显示文件的1px边界。因此,我尝试将 View 上的填充设置为 -1,以便不显示该行。这似乎不起作用,因为黑线仍在显示。

    <ImageView
        android:id="@+id/stub_image"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:scaleType="centerCrop"
        android:padding="-1px"
        android:cropToPadding="true"
        android:src="@drawable/stub_image"
        android:contentDescription="@string/image_title" />

如何将此布局设置为不显示 PNG 周围的 1px 边界?我可以在不覆盖 View 类并手动处理像素的情况下做到这一点吗?

解决方案

在@alex 链接到的帖子上的第一个选项之后,我在一个空的解决方案中编译了 Ninepatch 文件。然后将这些从我的服务器提供给应用程序。由于png可能是服务器发送的,还有ninepatches,我用来获取drawable的代码如下:

InputStream stream = .. //whatever
Bitmap bitmap = BitmapFactory.decodeStream(stream);
byte[] chunk = bitmap.getNinePatchChunk();
if (NinePatch.isNinePatchChunk(chunk)) {
    return new NinePatchDrawable(getResources(), bitmap, chunk, new Rect(), null);
} else {
    return new BitmapDrawable(getResources(), bitmap);
}

【问题讨论】:

  • 如果边框仍然显示,我认为它不会将图像加载为 9-patch 可绘制对象。您正在使用 centerCrop 作为 scaleType 统一缩放图像(保持图像的纵横比),以便图像的两个尺寸(宽度和高度)将等于或大于视图的相应尺寸(减去填充)。换句话说,它在不改变纵横比的情况下拉伸图像以完全填充绘图区域,这看起来好像是像 9-patch drawable 一样绘制的。您服务器上的 PNG 有什么扩展名?
  • 如果我将布局更改为 wrap_content 并放下 centerCrop,它实际上会将整个图像折叠到非拉伸区域。

标签: android layout padding nine-patch


【解决方案1】:

使用NinePatchDrawable 解析Bitmap,使其正确显示。

【讨论】:

  • 它没有很好的记录,但我的理解是提供给 NinePatchDrawable 构造函数的块是编译的九补丁数据,我无法在应用程序中进行。
  • 事实证明这比我想象的要复杂。看到这个答案:stackoverflow.com/questions/5079868/…
  • 我在链接问题中选择了选项 1)。感谢您的领导!
猜你喜欢
  • 2015-10-04
  • 2021-03-15
  • 1970-01-01
  • 1970-01-01
  • 2015-08-27
  • 2012-07-20
  • 1970-01-01
  • 1970-01-01
  • 2014-07-16
相关资源
最近更新 更多