带有 9-patch 的 Android PorterDuff 蒙版在 android 4.4

问题描述

我正在尝试使用 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:backgroundConstraintLayout。出于某种原因,这在 android 4 中不起作用。因此,为了解决这个问题,我删除了 android:backgroundConstraintLayout,并使用 disPatchDraw() 将遮罩颜色应用于 canvas.drawColor(colorId) 上的视图}},在调用 super.onDispatchDraw() 之前。