我创建了一个扩展 TextView 的自定义 View 。我想在椭圆上使用 BlurMaskFilter,但是,除非我使用 LAYER_TYPE_SOFTWARE,否则椭圆不会像预期的那样模糊。使用 LAYER_TYPE_SOFTWARE 将正确模糊 View ,但是现在它被裁剪到我想要避免的边界,因为我正在尝试创建彩色阴影效果。
奇怪的是,我只在 API 的 21-27 上遇到这个问题(最小 API 是 21)。在 API 的 28+ BlurMaskFilter 与硬件加速一起正常工作,并且在 View 边界之外绘制也没有问题。
LAYER_TYPE_HARDWARE
LAYER_TYPE_SOFTWARE
LAYER_TYPE_HARDWARE API 28+ (Desired effect)
我尝试在层次结构中的所有 View 上设置 clipChildren=false,但没有成功。
根据这篇文章,我还尝试使用负值增加 canvas.clipRect:https://stackoverflow.com/a/15506277/5752426然而,这似乎只在使用正值来减少绘图区域时起作用,并且在使用负值在 View 边界之外绘制时没有效果。
我可以通过增加 onMeasure() 中的 View 边界然后只在这些 View 边界内绘制来解决这个问题,但是,这并不理想,因为我现在在布局中定位我的 View 时必须考虑这个额外的空间。此外,由于不同的 View 可能具有不同的高度和阴影/模糊大小,因此该问题变得不一致。
自定义 View 的初始化 block :
init {
this.setLayerType(View.LAYER_TYPE_SOFTWARE, null)
setWillNotDraw(false)
...
onDraw 用于自定义 View :
override fun onDraw(canvas: Canvas?) {
...
if (elevation > 0f) {
circleShadowBackgroundPaint.maskFilter = circleBlurMaskFilter
canvas?.drawOval(circleBlurBackground, circleShadowBackgroundPaint)
}
...
任何帮助,将不胜感激!
最佳答案
如果将此 View 的 LayerType 设置为 LAYER_TYPE_SOFTWARE,clipCHildren 和 clipToPadding 将不再对此 View 产生任何影响。您应该在其 Parent(或 parent 的 parent,如果 parent 与此 View 的大小一样大)上设置 LayerType。
你可以试试(View (getParent())).setLayerType(View.LAYER_TYPE_SOFTWARE, null)
关于android - 带有 LAYER_TYPE_SOFTWARE 剪辑 View 的自定义 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57348974/