问题描述
我正在尝试使用 9-patch 掩码来掩蔽 ConstraintLayout。在 Android 4.4 以上的版本中工作正常。对于 Android 4.4,屏幕上会出现一个黑色方块,如下所示:即使使用不同的 9-patch。
这是我用 9-patch 屏蔽的代码。 backgroundMask 变量是一个 NinePatchDrawable。
override fun onSizeChanged(w: Int,h: Int,oldw: Int,oldh: Int) {
backgroundMask?.setBounds(0,w,h)
super.onSizeChanged(w,h,oldw,oldh)
}
override fun dispatchDraw(canvas: Canvas) {
super.dispatchDraw(canvas)
backgroundMask?.let {
it.paint.xfermode = PorterDuffXfermode(PorterDuff.Mode.DST_IN)
it.draw(canvas)
}
}
我还设置了 setLayerType(LAYER_TYPE_HARDWARE,null)
并在视图的构造函数中尝试了 setLayerType(LAYER_TYPE_SOFTWARE,null)
,但也不适用于 android 4.4。
在这个 Android 版本中,我可以用什么来解决这个问题?
解决方法
我终于找到了问题所在。问题是设置我们想要屏蔽的 android:background
的 ConstraintLayout
。出于某种原因,这在 android 4 中不起作用。因此,为了解决这个问题,我删除了 android:background
的 ConstraintLayout
,并使用 disPatchDraw()
将遮罩颜色应用于 canvas.drawColor(colorId)
上的视图}},在调用 super.onDispatchDraw()
之前。