重复的背景图像被拉伸

时间:2012-08-22 16:49:21

标签: android background repeat tile stretch

我在纹理背景上遇到了很多困难。我有一个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像素的图像。

因此,问题在于纹理图像在被平铺的同时被放大。我在纹理图像的外部添加了一条红线,以确切了解纹理图像的位置,结果如下:

Tiled Background

我还根据getResources()添加了屏幕高度,宽度和密度.getDisplayMetrics()。

由于屏幕宽度为480像素,因此纹理图像应重复8次(480/60 = 8)。相反,只有5~1 / 4。图像现在约为90像素并平铺。 WTF?

当我明确告诉它重复时,为什么我的纹理图像会被拉伸?

2 个答案:

答案 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而不进行缩放。