Плиточный фон толкает его Вид размера
У меня есть черепичное растровое изображение, которое я использую в качестве фона 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" />
Я тестировал это и, похоже, работает.