2012-08-22 173 views
3

我有一个很难与纹理背景。我有一个60px x 60px的位图纹理,我想将其设置为重复平铺模式中布局的背景。这里是位于RES /布局的布局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 /绘制:

<?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是60×60像素的图像。

所以,问题是纹理图像正在放大,同时也正在平铺。我添加了一个红线纹理图像的外侧清楚地看到,其中纹理图像是,这里的结果:

Tiled Background

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

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

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

回答

4

设置anyDensity=true后演戏了,我不知道什么拉哈夫的参考与错误,正好,但如果他们已经在ICS改变的东西+再有就是肯定东西错误。也就是说,我相当确定drawable中的位图图像被假定为mdpi,并从那里缩放(也许它们改变了这种行为?),这在您的60px图像变为90px(60 * 1.5缩放因子)的情况下是合理的。

您可以完全避免缩放,请记住,不同密度下的物理大小会有所不同(但对于平铺背景,这可能并不重要),只需将您的位图放入drawable-nodpi文件夹即可。无论密度如何,Android都将使用这些可绘制的缩放。

+0

感谢您节省我从更多的小时麻烦! – Chewie

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

+1

你确定这是一个错误?我认为这是因为它正在进行密度缩放。 @Chewie可以尝试将图像放在'drawable-nodpi'中,看看它是否有效? – kcoppock

+0

我很确定。我记得从Android手机开发人员谷歌小组那里阅读Romain或Dianne发来的邮件。 –

+0

@kcoppock这就是它!显然,我错过了关于/ drawable中的图像的所有内容,因为它们的大小是mdpi,所以会进行预先缩放。如果您提交,我会按照自己的方式抛出正确答案。 – Chewie