2012-08-22 221 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