LayerDrawable как фоновый рисунок не работает на minSdkVersion=15 или ниже

Хотя мне не удалось найти никаких ограничений версии SDK для LayerDrawable (добавлено на уровне API 1), тот, который я использую в качестве фона, действует по-разному в зависимости от minSdkVersion: если он 15 или ниже, фон полностью черный, если он 19 или выше (KitKat‹), отображаются слои как и ожидалось.

Я программно заменяю первый элемент в списке слоев. Вот как я использую класс LayerDrawable (хотя проблем быть не должно):

BitmapDrawable bitmapDrawable = (BitmapDrawable) resources.getDrawable(R.drawable.xyz1);
bitmapDrawable.setColorFilter(getColor(), PorterDuff.Mode.MULTIPLY);
bitmapDrawable.setTileModeXY(TileMode.REPEAT, TileMode.REPEAT);

LayerDrawable bgDrwbl = (LayerDrawable) resources.getDrawable(R.drawable.mylayerdrawable);
bgDrwbl.setDrawableByLayerId(R.id.frameBitmap, bitmapDrawable);

int sdk = android.os.Build.VERSION.SDK_INT;
if(sdk < android.os.Build.VERSION_CODES.JELLY_BEAN) {
    v.setBackgroundDrawable(bgDrwbl);
} else {
    v.setBackground(bgDrwbl);
}

Где mylayerdrawable выглядит следующим образом:

<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >

<item
    android:id="@+id/frameBitmap"
    android:left="@dimen/card_frame_width"
    android:right="@dimen/card_frame_width"
    android:top="@dimen/card_frame_width"
    android:bottom="@dimen/card_frame_width" >

    <bitmap 
        android:tileMode="repeat"/>
</item>
<item>
    <shape android:shape="rectangle" >
        <stroke
            android:height="@dimen/card_frame_width"
            android:width="@dimen/card_frame_width"
            android:color="#000000" />

        <corners android:radius="4dp" />
    </shape>
</item>
<item
    android:left="0.4dp"
    android:right="0.4dp"
    android:top="0.4dp"
    android:bottom="0.4dp">
    <shape android:shape="rectangle" >
        <stroke
            android:height="1.8dp"
            android:width="1.8dp"
            android:color="#EAEAEA" />

        <corners android:radius="4dp" />
    </shape>
</item>

While debugging I noticed the following missing members of bgDrwbl in minSdkVersion=15 compared to 19:

  • LayerDrawable.mLayerState.mAutoMirrored
  • LayerDrawable.mLayoutDirection (член базового класса: Drawable)

Я не знаю, имеют ли какие-либо из них решающее значение, если кто-то использует LayerDrawable, как я (?), Но я не получил ни предупреждения, ни предложений по использованию LayerDrawable с разными версиями SDK. У вас есть подсказки?


person meztelentsiga    schedule 05.06.2016    source источник
comment
это работает без вызова setDrawableByLayerId?   -  person pskink    schedule 05.06.2016
comment
То же самое без вызова setDrawableByLayerId(). Поиграв с xml, я понял, что проблема не в первом слое (слое растрового изображения), а во втором и третьем, которые должны создавать закругленную рамку вокруг растрового изображения. Удаление второго И третьего слоя позволяет отображать растровое изображение, добавление любого из двух создает ту же проблему (черный фон).   -  person meztelentsiga    schedule 06.06.2016


Ответы (1)


Я слишком предвзято относился к LayerDrawable, так как раньше у меня было слишком много проблем с тем, чтобы заставить его работать... Но оказалось, что проблема не имеет ничего общего ни с ними, ни с minSdkVersion, а лежит в формах, определенных во втором и третьем пунктах. в случае некоторых устройств. На ту же проблему уже дан ответ здесь. Короче говоря:

Поэтому никогда не оставляйте фигуры с рамкой без цвета, так как некоторые устройства окрашивают ее в черный цвет!

person meztelentsiga    schedule 07.06.2016