我在纹理背景上遇到了很多困难。我有一个60px乘60px位图纹理,我想在重复的图块模式中设置为我的布局的背景。这是位于res / layout中的布局xml:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="@drawable/dark_texture_background" >
...
</RelativeLayout
这是dark_texture_background,位于res / drawable:
<?xml version="1.0" encoding="utf-8"?>
<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
android:src="@drawable/dark_background_texture"
android:tileMode="repeat" />
dark_background_texture是60x60像素的图像。
因此,问题在于纹理图像在被平铺的同时被放大。我在纹理图像的外部添加了一条红线,以确切了解纹理图像的位置,结果如下:
我还根据getResources()添加了屏幕高度,宽度和密度.getDisplayMetrics()。
由于屏幕宽度为480像素,因此纹理图像应重复8次(480/60 = 8)。相反,只有5~1 / 4。图像现在约为90像素并平铺。 WTF?
当我明确告诉它重复时,为什么我的纹理图像会被拉伸?
答案 0 :(得分:10)
这是Android框架中的一个错误,它是ICS以后修复的。无论如何,这是预ICS版本的粗略解决方法:
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 :(得分:4)
我不确定Raghav所指的是什么,确切地说,但是如果他们在ICS +中改变了某些内容,那么肯定有某些错误。也就是说,我相当肯定drawable
中的位图图像被认为是mdpi
,并从那里缩放(可能是他们改变了这种行为?),这是有意义的,因为你的60px图像变为90px(60 * 1.5比例因子)。
您可以完全避免缩放,请记住,不同密度的物理尺寸会有所不同(尽管对于平铺背景,它可能并不重要),只需将位图放入drawable-nodpi
文件夹即可。无论密度如何,Android都会使用这些drawable而不进行缩放。