StateListDrawable и мозаичное растровое изображение - PullRequest
8 голосов
/ 14 сентября 2011

Это мой пользовательский селектор (StateListDrawable)

<selector
    xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:drawable="@drawable/common_cell_background" />
    <item
        android:state_pressed="true"
        android:drawable="@drawable/common_cell_background_highlight" />
    <item
        android:state_focused="true"
        android:drawable="@drawable/common_cell_background_highlight" />
    <item
        android:state_selected="true"
        android:drawable="@drawable/common_cell_background_highlight" />
</selector>

Обе, common_cell_background и common_cell_background_highlight, являются XML. Код ниже:

common_cell_background.xml

<bitmap
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:src="@drawable/common_cell_background_bitmap"
    android:tileMode="repeat"
    android:dither="true">
</bitmap>

common_cell_background_highlight.xml

<bitmap
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:src="@drawable/common_cell_background_bitmap_highlight"
    android:tileMode="repeat"
    android:dither="true">
</bitmap>

Растровые изображения также точно такие же. Подсветка чуть светлее и других отличий нет. Оба растровых изображения являются файлами PNG.

Теперь я установил

convertView.setBackgroundResource(R.drawable.list_item_background);

и вот проблема. Мой common_cell_background не повторяется, он растянут. Но что удивительного, когда я касаюсь ячейки моего списка, фон меняется на common_cell_background_highlight и угадаю, что? Все хорошо, повторяется так, как должно быть. Я понятия не имею, в чем проблема, почему мой фон не повторяется, в то время как подсветка повторяется. Есть мысли?

1 Ответ

3 голосов
/ 22 июня 2012

Это ошибка, она была исправлена ​​в ICS, см. Ответ: https://stackoverflow.com/a/7615120/1037294

Вот обходной путь: https://stackoverflow.com/a/9500334/1037294

Обратите внимание, что обходной путь применим только для BitmapDrawable, для других типов рисованных объектов, таких как StateListDrawable, вам потребуется выполнить дополнительную работу. Вот что я использую:

public static void fixBackgrndTileMode(View view, TileMode tileModeX, TileMode tileModeY) {
    if (view != null) {
        Drawable bg = view.getBackground();

        if (bg instanceof BitmapDrawable) {
            BitmapDrawable bmp = (BitmapDrawable) bg;
            bmp.mutate(); // make sure that we aren't sharing state anymore
            bmp.setTileModeXY(tileModeX, tileModeY);
        }
        else if (bg instanceof StateListDrawable) {
            StateListDrawable stateDrwbl = (StateListDrawable) bg;
            stateDrwbl.mutate(); // make sure that we aren't sharing state anymore

            ConstantState constantState = stateDrwbl.getConstantState();
            if (constantState instanceof DrawableContainerState) {
                DrawableContainerState drwblContainerState = (DrawableContainerState)constantState;
                final Drawable[] drawables = drwblContainerState.getChildren();
                for (Drawable drwbl : drawables) {
                    if (drwbl instanceof BitmapDrawable)
                        ((BitmapDrawable)drwbl).setTileModeXY(tileModeX, tileModeY);
                }
            }
        }
    }
}
...