平铺的drawable有时伸展

时间:2010-12-02 14:54:46

标签: android xml drawable tiling

我有一个ListView,其项目具有平铺背景。为此,我使用以下drawable 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中,因为我读到了没有它的地方可能存在错误。这并没有改变任何事情。

有没有人有同样的问题?你是怎么解决的?

9 个答案:

答案 0 :(得分: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”后开始表现

答案 1 :(得分:9)

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

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

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

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

现在一切正常。所以是的,这看起来像是一个错误。

答案 2 :(得分:6)

由于我没有看到此处的链接,因此在Android中为confirmed to be a bug。它已在ICS中修复。有关详细信息,请参阅XML drawable Bitmap tileMode bug?

答案 3 :(得分:6)

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

  • 如果你仍然不知所措,我的建议是保留所有平铺位图 平方,二维基础的资源

ie:xppi tile资产的16px乘16px。

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

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

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

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

答案 4 :(得分:2)

这听起来像个臭虫,虽然我自己从未见过它。如果您有一个简单的APK重现问题,请发送给我(romainguy / at / android.com)或提交错误here

答案 5 :(得分:1)

This blog条目讨论了问题

结合Ivo van der Wijk列出的Tapas的this solution,它对我有用。

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

编辑:实际上,我撒了谎。即便如此,它似乎有时也无法平铺。

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

编辑2:将其设置为其他内容(例如,CLAMPED),然后将其设置回目前为止似乎正在运行。

答案 6 :(得分:0)

在运行Lollipop的旧设备上仍然遇到此问题,会在方向更改时发生。以编程方式设置磁贴模式并不起作用,但这个答案确实如此:https://stackoverflow.com/a/13480444/658727

答案 7 :(得分:0)

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

答案 8 :(得分:0)

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

tile_bitmap.xml

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

layout.xml

<ImageView
    android:layout_width="match_parent"
    android:src="@drawable/tile_bitmap"
    android:layout_height="match_parent"
    android:scaleType="fitXY"/>