3

テクスチャ付きの背景でかなり苦労しています。60x60 ピクセルのビットマップ テクスチャを繰り返しタイル パターンのレイアウトの背景として設定したいと考えています。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

これは、ICS 以降で修正された Android フレームワークのバグです。とにかく、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=trueAndroidManifest.xmlに設定した後、バグが発生し始めることがあります。

于 2012-08-22T16:53:18.473 に答える
4

Raghav がこのバグで何を指しているのか正確にはわかりませんが、もし彼らが ICS+ で何かを変更したのなら、何か問題があったことは確かです。とは言っても、 のビットマップ画像が でdrawableあると想定さmdpiれ、そこからスケーリングされていることはかなり確信しています (おそらく、その動作が変更されたのでしょうか?)。

drawable-nodpiビットマップをフォルダーのみに配置することで、物理的なサイズが密度によって異なることに注意してください (ただし、タイル張りの背景の場合はおそらく重要ではありません) 。Android は、密度に関係なく、スケーリングせずにこれらのドローアブルを使用します。

于 2012-08-22T21:10:09.877 に答える