android - 带有 LAYER_TYPE_SOFTWARE 剪辑 View 的自定义 View

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

我创建了一个扩展 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/

相关文章:

android - 推出 SDK OTA 更新

java - 自定义 View 的 getWidth() 和 getHeight() 给出了错误的值

android - Sprite 图像动画

android - 按下状态未填充到我的自定义 View

javascript - 对 jQuery 的不关注是 (':focus' )

html - CSS3 : remove blur effect on scale

android - 想在我的应用程序中提供适当的导航系统..?

android - ToggleButton 状态 OnClick

android - 未找到 Xamarin ZipAlign

jquery - 将变量传递给 jquery eq() 函数不起作用