55

我有一个 ListView,其项目具有平铺背景。为此,我使用以下可绘制 xml:

<bitmap
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:src="@drawable/tile"
    android:tileMode="repeat" />

通常,这是有效的。然而,有时,src drawable 不是平铺的,而是拉伸以填充整个列表项。(我有几个像这样的不同图块,我将它们混合在一个 ListView 中。如果有拉伸而不是平铺,它永远不会同时出现在所有这些中,因为这是值得的。)

我还尝试添加android:dither="true"到该 xml,因为我在某处读到没有它可能会有错误。那并没有改变什么。

有没有人有同样的问题?你怎么修好它的?

4

8 回答 8

39

我也被这个问题咬了。很难诊断,甚至更难找到类似的报告和可用的解决方案。

freenode #android-dev irc 频道上的“Tapas”带有以下实用方法:

public static void fixBackgroundRepeat(View view) {
    Drawable bg = view.getBackground();
    if (bg != null) {
        if (bg instanceof BitmapDrawable) {
            BitmapDrawable bmp = (BitmapDrawable) bg;
            bmp.mutate(); // make sure that we aren't sharing state anymore
            bmp.setTileModeXY(TileMode.REPEAT, TileMode.REPEAT);
        }
    }
}

将其应用于所有具有平铺背景集的视图(例如 findViewById 它们)。

此外,我的印象是,在 AndroidManifest.xml 中设置“anyDensity=true”后,此错误开始出现

于 2012-02-29T13:49:52.477 回答
9

除了 CLAMP TileMode,我刚刚遇到了完全相同的问题。我有一个位图,然后我想在底部拉伸并将其设置为 XML 定义的 BitmapDrawable 并且在图形预览窗口中看起来都很好,无论我制作的 ViewImage 大小如何,它都会在顶部绘制我的位图然后重复最后一个像素填充到最后。

在模拟器和我自己的手机上的各种 SDK 版本上启动应用程序都会产生完全无用的直接“填充”类型失真。

解决方案原来只是在我每次更改代码中 ImageView 的大小时重新应用 TileMode:

((BitmapDrawable)ascender.getDrawable()).setTileModeY(TileMode.CLAMP);

现在一切都画得很好。所以是的,这对我来说似乎是一个错误。

于 2011-05-01T23:33:33.417 回答
6

由于我没有在此处看到链接,因此已确认这是Android 中的错误。它已在 ICS 中修复。查看XML 可绘制位图 tileMode 错误?更多细节。

于 2012-06-18T20:47:00.617 回答
6

网上有很多关于这个话题的噪音,有各种(和无数)建议的解决方案。

  • 如果您仍然不知所措,我的建议是将所有平铺位图资源保持为正方形,base-2 维度

即:xhdpi 平铺资产为 16 像素 x 16 像素。

如果位图没有完美地镶嵌,我希望 Android 平台会“过度平铺”以填充空间 - 然后修剪浪费。然而,在 mdpi、hdpi 和 xhdpi(以及 v2.3 到 v4.0)上“不一致地”试用 10px*10px 平铺位图显示了这种拉伸。

以 2 为底的维度允许在您通过各种分辨率进行时进行整体甚至划分,并且在每次创建视图时每个设备都尝试绘制图块。

在 Android 开发中,我们与测距硬件竞争,并且供应商将手指伸入平台 - 有时这种微不足道的黑魔法会奏效。

这似乎至少为我解决了这个问题。值得一试。

于 2013-08-02T07:26:47.240 回答
2

这听起来像一个错误,虽然我自己从未见过。如果您有一个简单的 APK 可以重现该问题,请将其发送给我 (romainguy /at/android.com) 或在此处提交错误。

于 2011-02-15T17:39:59.533 回答
1

这篇博文讨论了这个问题

结合Ivo van der Wijk 列出的 Tapas 的这个解决方案,它对我有用。

关键是从 XML 中删除平铺设置,然后在运行时将其设置为平铺。如果它们都设置为平铺,它对我不起作用。

编辑:实际上,我撒了谎。即使这样,它似乎有时也无法平铺。

有一个可靠的解决方法会非常好。

编辑2:将其设置为其他内容(例如CLAMPED)然后将其设置回目前似乎有效。

于 2012-05-01T03:14:59.793 回答
0

我将图像从文件夹移到了drawable-xhdpi文件drawable夹,一切都很好。

于 2016-11-24T07:26:55.597 回答
0

我也有同样的问题。我缺少的是我们需要在 imageview 中将 scaletype 添加到 fitXY 以使 xml 位图正常工作。

tile_bitmap.xml

<bitmap
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:src="@drawable/tile"
    android:tileMode="repeat" />

布局.xml

<ImageView
    android:layout_width="match_parent"
    android:src="@drawable/tile_bitmap"
    android:layout_height="match_parent"
    android:scaleType="fitXY"/>
于 2017-10-10T09:29:42.150 回答