【问题标题】:Custom View with LAYER_TYPE_SOFTWARE clips view带有 LAYER_TYPE_SOFTWARE 剪辑视图的自定义视图
【发布时间】:2019-12-12 09:49:35
【问题描述】:

我创建了一个扩展 TextView 的自定义视图。我想在椭圆上使用 BlurMaskFilter,但是,除非我使用 LAYER_TYPE_SOFTWARE,否则椭圆不会像预期的那样模糊。使用 LAYER_TYPE_SOFTWARE 会正确模糊视图,但是现在它被剪裁到我想要避免的边界,因为我正在尝试创建彩色阴影效果。

奇怪的是,我只在 API 的 21-27(最小 API 为 21)上遇到了这个问题。在 API 的 28+ BlurMaskFilter 上可以与硬件加速一起正常工作,并且在视图边界之外绘制也没有问题。

LAYER_TYPE_HARDWARE

LAYER_TYPE_SOFTWARE

LAYER_TYPE_HARDWARE API 28+ (Desired effect)

我尝试在层次结构中的所有视图上设置 clipChildren=false,但没有成功。

我还尝试根据这篇文章使用负值来增加 canvas.clipRect:https://stackoverflow.com/a/15506277/5752426 但是这似乎只在使用正值来减小绘图区域时才有效,并且在使用负值在外部绘制时不起作用查看边界。

我可以通过增加 onMeasure() 中的视图边界然后只在这些视图边界内绘制来解决这个问题,但是,这并不理想,因为我现在在定位视图时必须考虑这个额外的空间布局。此外,由于不同的视图可能具有不同的高度和阴影/模糊大小,因此问题变得不一致。

自定义视图的初始化块:

 init {
        this.setLayerType(View.LAYER_TYPE_SOFTWARE, null)
        setWillNotDraw(false)
...

自定义视图的onDraw:


override fun onDraw(canvas: Canvas?) {

...

    if (elevation > 0f) {
        circleShadowBackgroundPaint.maskFilter = circleBlurMaskFilter
        canvas?.drawOval(circleBlurBackground, circleShadowBackgroundPaint)
    }

...

任何帮助将不胜感激!

【问题讨论】:

    标签: android android-custom-view blur clip hardware-acceleration


    【解决方案1】:

    如果您将此视图的LayerType 设置为LAYER_TYPE_SOFTWARE,clipCHildren 和clipToPadding 将不再对该视图产生任何影响。您应该在其Parent(或父级的父级,如果父级与此视图的大小一样大)上设置LayerType .

    你可以试试(View (getParent())).setLayerType(View.LAYER_TYPE_SOFTWARE, null)

    【讨论】:

      猜你喜欢
      • 2015-04-22
      • 2015-12-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-17
      • 1970-01-01
      相关资源
      最近更新 更多