Плиточный фон толкает его Вид размера

У меня есть черепичное растровое изображение, которое я использую в качестве фона View. Это View, скажем, имеет android:layout_height="wrap_content". Проблема в том, что высота растрового изображения, используемого в фоновом режиме, участвует в измерении вида, увеличивая высоту View. Это можно заметить, когда размер содержимого View меньше высоты растрового изображения, используемого в качестве фона плитки.

Позвольте мне показать вам пример. Растровое изображение плитки:

enter image description here

Растровое изображение (tile_bg.xml):

<?xml version="1.0" encoding="utf-8"?>
<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
    android:src="@drawable/tile"
    android:tileMode="repeat"/>

Макет:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical"
    android:background="#FFFFFF">

    <TextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:background="@drawable/tile_bg"
        android:text="@string/hello"
        android:textColor="#000000" />

</LinearLayout>

Как это выглядит:

enter image description here

Высота TextView заканчивается высотой растрового изображения. Я ожидал, что растровое изображение обрезается до размера View.

Есть ли способ достичь этого?

Примечания:

  • Я не могу использовать вытяжки 9patch, так как фон должен быть повторен способом мозаики, растяжка не является вариантом.
  • Я не могу установить фиксированную высоту для View, это зависит от детей (я использую это в ViewGroup)
  • Это странное поведение происходит, как я объяснял ранее, когда размер View меньше, чем размер растрового изображения, в противном случае битмап повторяется правильно отрезанным (т.е. если размер представления составляет 1,5x, размер растровое изображение, вы получите в 1,5 раза растровое изображение).
  • Пример относится к высоте, но тот же, что и ширина.

Ответ 1

Вам нужен пользовательский BitmapDrawable, который возвращает 0 из getMinimumHeight() и getMinimumWidth(). Здесь я назвал BitmapDrawableNoMinimumSize, который выполняет задание:

import android.content.res.Resources;
import android.graphics.drawable.BitmapDrawable;

public class BitmapDrawableNoMinimumSize extends BitmapDrawable {

    public BitmapDrawableNoMinimumSize(Resources res, int resId) {
        super(res, ((BitmapDrawable)res.getDrawable(resId)).getBitmap());
    }

    @Override
    public int getMinimumHeight() {
        return 0;
    }
    @Override
    public int getMinimumWidth() {
         return 0;
    }
}

Конечно, вы не можете (AFAIK) объявлять пользовательские чертежи в XML, поэтому вам необходимо создать экземпляр и установить исходный текст:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    BitmapDrawable bmpd =new BitmapDrawableNoMinimumSize(getResources(), R.drawable.tile);
    bmpd.setTileModeX(TileMode.REPEAT);
    bmpd.setTileModeY(TileMode.REPEAT);
    findViewById(R.id.textView).setBackgroundDrawable(bmpd);
}

И, конечно, вы удаляете атрибут фона из макета xml:

<TextView
    android:id="@+id/textView"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:text="Testing testing testing"
    android:textColor="#000000" />

Я тестировал это и, похоже, работает.