StateListDrawable и мозаичное растровое изображение
Это мой пользовательский селектор (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 ответ
Это ошибка, она была исправлена в ICS, см. Ответ: /questions/27236894/oshibka-v-otrisovke-xml-rastrovogo-izobrazheniya/27236902#27236902
Вот обходной путь: /questions/23247608/plitochnyij-tyanuschij-inogda-tyanetsya/23247623#23247623
Обратите внимание, что обходной путь применим только для 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);
}
}
}
}
}