【发布时间】: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