3

我很难使用带纹理的背景。我有一个 60 像素 x 60 像素的位图纹理,我想将其设置为重复平铺图案中布局的背景。这是位于 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

这是位于 res/drawable 中的 dark_texture_background:

<?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 像素并平铺。怎么回事?

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

4

2 回答 2

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() 它们)。

anyDensity=true有时,在 AndroidManifest.xml 中设置后,错误开始出现

于 2012-08-22T16:53:18.473 回答
4

我不确定 Raghav 到底指的是什么错误,但如果他们在 ICS+ 中更改了某些内容,那么肯定有问题。也就是说,我相当肯定其中的位图图像drawable被假定为mdpi,并从那里缩放(也许他们改变了这种行为?),鉴于您的 60px 图像变为 90px(60 * 1.5 缩放因子),这是有道理的。

您可以完全避免缩放,请记住物理尺寸会因密度不同而不同(尽管对于平铺背景可能并不重要),drawable-nodpi只需将位图放入文件夹即可。无论密度如何,Android 都将使用这些可绘制对象而不进行缩放。

于 2012-08-22T21:10:09.877 回答