我有一个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中,因为我读到了没有它的地方可能存在错误。这并没有改变任何事情。
有没有人有同样的问题?你是怎么解决的?
答案 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"/>