Плиточный фон выдвигает свой размер - PullRequest
10 голосов
/ 13 января 2012

У меня есть мозаичное растровое изображение, которое я использую в качестве 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.

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

Примечания:

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

1 Ответ

14 голосов
/ 17 января 2012

Вам нужен пользовательский 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);
}

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...