LayerDrawable 作为背景可绘制对象在 minSdkVersion=15 或更低版本上不起作用
LayerDrawable as background drawable does not work on minSdkVersion=15 or lower
虽然我找不到 LayerDrawable
(added in API level 1) 的任何 SDK 版本限制,但我用作背景的那个根据 minSdkVersion 的不同而有所不同:如果它是 15 或更低, 背景全黑, 如果是19或更高(KitKat<), 图层按预期显示。
我正在以编程方式替换图层列表中的第一项。下面是我如何使用 LayerDrawable
class(虽然应该没有任何问题):
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>
调试时我注意到 minSdkVersion=15 与 19 相比 bgDrwbl
缺少以下成员:
LayerDrawable.mLayerState.mAutoMirrored
LayerDrawable.mLayoutDirection
(基地成员class:Drawable
)
如果有人像我一样使用 LayerDrawable(?),我不知道它们中的任何一个是否至关重要,但我既没有收到任何警告,也没有找到任何关于将 LayerDrawable
用于不同 SDK 版本的建议。你有什么提示吗?
我对 LayerDrawable
抱有太大的偏见,因为我以前在使它工作时遇到了太多麻烦...但事实证明问题与它们或 minSdkVersion 无关,而是在于在某些设备的情况下,第二项和第三项中定义的形状。
同样的问题已经回答 here。简而言之:
So never leave shapes with border without color as some devices will
paint it black!
虽然我找不到 LayerDrawable
(added in API level 1) 的任何 SDK 版本限制,但我用作背景的那个根据 minSdkVersion 的不同而有所不同:如果它是 15 或更低, 背景全黑, 如果是19或更高(KitKat<), 图层按预期显示。
我正在以编程方式替换图层列表中的第一项。下面是我如何使用 LayerDrawable
class(虽然应该没有任何问题):
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>
调试时我注意到 minSdkVersion=15 与 19 相比 bgDrwbl
缺少以下成员:
LayerDrawable.mLayerState.mAutoMirrored
LayerDrawable.mLayoutDirection
(基地成员class:Drawable
)
如果有人像我一样使用 LayerDrawable(?),我不知道它们中的任何一个是否至关重要,但我既没有收到任何警告,也没有找到任何关于将 LayerDrawable
用于不同 SDK 版本的建议。你有什么提示吗?
我对 LayerDrawable
抱有太大的偏见,因为我以前在使它工作时遇到了太多麻烦...但事实证明问题与它们或 minSdkVersion 无关,而是在于在某些设备的情况下,第二项和第三项中定义的形状。
同样的问题已经回答 here。简而言之:
So never leave shapes with border without color as some devices will paint it black!