平铺的drawable有时伸展

ben*_*nvd 54 xml android tiling drawable

我有一个ListView,其项目具有平铺背景.为此,我使用以下drawable xml:

<bitmap
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:src="@drawable/tile"
    android:tileMode="repeat" />
Run Code Online (Sandbox Code Playgroud)

通常,这是有效的.但是,有时,src drawable不会平铺,而是拉伸以填充整个列表项.(我有几个不同的瓷砖,我把它们混合在一个ListView中.如果有拉伸而不是平铺,那么它永远不会同时存在于所有这些中,因为这是值得的.)

我也尝试添加android:dither="true"到那个xml,因为我读到某个地方没有它可能会有bug.这并没有改变任何事情.

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

Ivo*_*ijk 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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

此外,我觉得这个错误在AndroidManifest.xml中设置"anyDensity = true"后开始起作用

  • 如何将其应用于xml中定义的drawable?我在<selector>中使用了这个drawable (2认同)

Zul*_*xia 9

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

在模拟器和我自己的手机上的各种SDK版本上启动应用程序,然后产生了直接的"填充"类型失真,这是完全没用的.

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

((BitmapDrawable)ascender.getDrawable()).setTileModeY(TileMode.CLAMP);
Run Code Online (Sandbox Code Playgroud)

现在一切都很好.所以,是的,这看起来像是一个错误.


Ste*_*roy 6

由于我没有看到这里的链接,这被证实是 Android中的一个错误.它已在ICS中修复.请参阅XML drawable Bitmap tileMode错误?更多细节.


mjw*_*mjw 6

关于这个主题在线有很多噪音,有各种(和众多)建议的解决方案.

  • 如果您仍然处于亏损状态,我的建议是将所有平铺位图资源保持为方形,基数为2的维度.

即:对于xhdpi tile资产,16px乘16px.

如果位图没有完美镶嵌,我希望Android平台能够"过度平铺"以填充空间 - 然后减少浪费.然而,在mdpi,hdpi和xhdpi(和v2.3到v4.0)'不一致'上试验10px*10px平铺位图显示了这种拉伸.

base-2维度允许在进行各种分辨率时进行整体和均匀划分,并且每次设备在每次创建视图时都尝试绘制切片.

在Android开发中,我们与测距硬件竞争,供应商将手指插入平台 - 有时这种琐碎的黑魔法才有效.

这似乎至少解决了这个问题.值得一试.