LayerDrawable 作为背景可绘制在 minSdkVersion=15 或更低时不起作用

Posted

技术标签:

【中文标题】LayerDrawable 作为背景可绘制在 minSdkVersion=15 或更低时不起作用【英文标题】:LayerDrawable as background drawable does not work on minSdkVersion=15 or lower 【发布时间】:2016-10-05 07:07:15 【问题描述】:

虽然我找不到LayerDrawable (added in API level 1) 的任何 SDK 版本限制,但我用作背景的版本会根据 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:
            android:
            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:
            android:
            android:color="#EAEAEA" />

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

在调试时,我注意到 minSdkVersion=15 与 19 相比,bgDrwbl 的以下成员缺失:

LayerDrawable.mLayerState.mAutoMirrored LayerDrawable.mLayoutDirection(基类成员:Drawable

如果有人像我一样使用 LayerDrawable,我不知道它们中的任何一个是否至关重要(?),但我没有收到任何警告,也没有找到任何关于将 LayerDrawable 与不同 SDK 版本一起使用的建议。你有什么提示吗?

【问题讨论】:

不调用setDrawableByLayerId也可以吗? 不调用setDrawableByLayerId()也一样。在玩弄了 xml 之后,我发现问题不在于第一层(位图层),而在于第二层和第三层,这应该在位图周围形成一个圆形框架。删除第二和第三层允许显示位图,添加两者中的任何一个都会产生同样的问题(黑色背景)。 【参考方案1】:

我对@9​​87654322@ 太有偏见了,因为我之前很难让它工作......但事实证明问题与它们或 minSdkVersion 无关,而是在定义的形状内某些设备的第二项和第三项。 here 已经回答了同样的问题。简而言之:

所以永远不要像某些设备那样留下没有颜色的边框形状 把它涂黑!

【讨论】:

以上是关于LayerDrawable 作为背景可绘制在 minSdkVersion=15 或更低时不起作用的主要内容,如果未能解决你的问题,请参考以下文章

LayerDrawable:这可以更有效地完成吗?

图层可绘制/图层列表未在彼此之上绘制形状

Android Drawable 详解

Android Drawable 详解

Android Drawable 详解

自定义设计文本框