Unity-Technologies / com.unity.uiwidgets

UIWidgets is a Unity Package which helps developers to create, debug and deploy efficient, cross-platform Apps.
https://unity.cn/uiwidgets
626 stars 78 forks source link

ClipPath 裁剪 BackdropFilter出现的问题 #277

Closed tomcatter closed 2 years ago

tomcatter commented 2 years ago

我想实现一个毛玻璃效果的控件,将外面矩形的四个角裁掉,所以我使用了ClipPath,代码如下:

new Center(
                    child: new ClipPath(
                        clipBehavior: Clip.antiAlias,
                        clipper: new BeveledClipper(20),
                        child: new BackdropFilter(
                            filter: ImageFilter.blur(sigmaX: 30, sigmaY: 20),
                            child: new Container(
                                width: _width,
                                height: _height,
                                color: Colors.white30,
                                padding: EdgeInsets.all(_padding),
                                child: _child
                                )
                            )
                        )
                );

BeveledClipper 的实现如下:

 class BeveledClipper : CustomClipper<Path>
    {
        private float topLeft;

        private float bottomLeft;

        private float topRight;

        private float bottomRigth;

        public BeveledClipper(float all = 10)
        {
            this.topLeft = this.bottomLeft = this.topRight = this.bottomRigth = all;
        }

        public override Path getClip(Size size)
        {
            var path = new Path();
            path.moveTo(topLeft, 0);
            path.lineTo(size.width - topRight, 0);

            path.lineTo(size.width, topRight);
            path.lineTo(size.width, size.height - bottomRigth);

            path.lineTo(size.width - bottomRigth, size.height);
            path.lineTo(bottomLeft, size.height);

            path.lineTo(0, size.height - topLeft);
            path.lineTo(0, topLeft);
            path.close();

            return path;
        }

        public override bool shouldReclip(CustomClipper<Path> oldClipper)
        {
            return oldClipper != this;
        }

    }

运行报错:

AssertionError: Another exception was thrown: $<no message available>
Unity.UIWidgets.rendering.ClipPathLayer..ctor (Unity.UIWidgets.ui.Path clipPath, Unity.UIWidgets.ui.Clip clipBehavior) (at Packages/com.unity.uiwidgets/Runtime/rendering/layer.cs:982)
Unity.UIWidgets.rendering.PaintingContext.pushClipPath (System.Boolean needsCompositing, Unity.UIWidgets.ui.Offset offset, Unity.UIWidgets.ui.Rect bounds, Unity.UIWidgets.ui.Path clipPath, Unity.UIWidgets.rendering.PaintingContextCallback painter, Unity.UIWidgets.ui.Clip clipBehavior, Unity.UIWidgets.rendering.ClipPathLayer oldLayer) (at Packages/com.unity.uiwidgets/Runtime/rendering/object.cs:309)
Unity.UIWidgets.rendering.RenderClipPath.paint (Unity.UIWidgets.rendering.PaintingContext context, Unity.UIWidgets.ui.Offset offset) (at Packages/com.unity.uiwidgets/Runtime/rendering/proxy_box.cs:1239)
Unity.UIWidgets.rendering.RenderObject._paintWithContext (Unity.UIWidgets.rendering.PaintingContext context, Unity.UIWidgets.ui.Offset offset) (at Packages/com.unity.uiwidgets/Runtime/rendering/object.cs:1290)
UnityEngine.Debug:LogException(Exception)
Unity.UIWidgets.foundation.D:logError(String, Exception) (at Packages/com.unity.uiwidgets/Runtime/foundation/debug.cs:63)
Unity.UIWidgets.foundation.UIWidgetsError:dumpErrorToConsole(UIWidgetsErrorDetails, Boolean) (at Packages/com.unity.uiwidgets/Runtime/foundation/assertions.cs:380)
Unity.UIWidgets.foundation.UIWidgetsError:dumpErrorToConsole(UIWidgetsErrorDetails) (at Packages/com.unity.uiwidgets/Runtime/foundation/assertions.cs:357)
Unity.UIWidgets.foundation.UIWidgetsError:reportError(UIWidgetsErrorDetails) (at Packages/com.unity.uiwidgets/Runtime/foundation/assertions.cs:407)
Unity.UIWidgets.rendering.RenderObject:_debugReportException(String, Exception) (at Packages/com.unity.uiwidgets/Runtime/rendering/object.cs:603)
Unity.UIWidgets.rendering.RenderObject:_paintWithContext(PaintingContext, Offset) (at Packages/com.unity.uiwidgets/Runtime/rendering/object.cs:1295)
Unity.UIWidgets.rendering.PaintingContext:paintChild(RenderObject, Offset) (at Packages/com.unity.uiwidgets/Runtime/rendering/object.cs:106)
Unity.UIWidgets.rendering.RenderShiftedBox:paint(PaintingContext, Offset) (at Packages/com.unity.uiwidgets/Runtime/rendering/shifted_box.cs:69)
Unity.UIWidgets.rendering.RenderObject:_paintWithContext(PaintingContext, Offset) (at Packages/com.unity.uiwidgets/Runtime/rendering/object.cs:1290)
Unity.UIWidgets.rendering.PaintingContext:paintChild(RenderObject, Offset) (at Packages/com.unity.uiwidgets/Runtime/rendering/object.cs:106)
Unity.UIWidgets.rendering.RenderBoxContainerDefaultsMixinContainerRenderObjectMixinRenderBox`2:defaultPaint(PaintingContext, Offset) (at Packages/com.unity.uiwidgets/Runtime/rendering/box.mixin.gen.cs:55)
Unity.UIWidgets.rendering.RenderStack:paintStack(PaintingContext, Offset) (at Packages/com.unity.uiwidgets/Runtime/rendering/stack.cs:491)
Unity.UIWidgets.rendering.RenderStack:paint(PaintingContext, Offset) (at Packages/com.unity.uiwidgets/Runtime/rendering/stack.cs:499)
Unity.UIWidgets.rendering.RenderObject:_paintWithContext(PaintingContext, Offset) (at Packages/com.unity.uiwidgets/Runtime/rendering/object.cs:1290)
Unity.UIWidgets.rendering.PaintingContext:paintChild(RenderObject, Offset) (at Packages/com.unity.uiwidgets/Runtime/rendering/object.cs:106)
Unity.UIWidgets.rendering.RenderProxyBoxMixinRenderObjectWithChildMixinRenderBox`1:paint(PaintingContext, Offset) (at Packages/com.unity.uiwidgets/Runtime/rendering/proxy_box.mixin.gen.cs:81)
Unity.UIWidgets.rendering.RenderObject:_paintWithContext(PaintingContext, Offset) (at Packages/com.unity.uiwidgets/Runtime/rendering/object.cs:1290)
Unity.UIWidgets.rendering.PaintingContext:paintChild(RenderObject, Offset) (at Packages/com.unity.uiwidgets/Runtime/rendering/object.cs:106)
Unity.UIWidgets.rendering.RenderProxyBoxMixinRenderObjectWithChildMixinRenderBox`1:paint(PaintingContext, Offset) (at Packages/com.unity.uiwidgets/Runtime/rendering/proxy_box.mixin.gen.cs:81)
Unity.UIWidgets.material._RenderInkFeatures:paint(PaintingContext, Offset) (at Packages/com.unity.uiwidgets/Runtime/material/material.cs:335)
Unity.UIWidgets.rendering.RenderObject:_paintWithContext(PaintingContext, Offset) (at Packages/com.unity.uiwidgets/Runtime/rendering/object.cs:1290)
Unity.UIWidgets.rendering.PaintingContext:paintChild(RenderObject, Offset) (at Packages/com.unity.uiwidgets/Runtime/rendering/object.cs:106)
Unity.UIWidgets.rendering.RenderProxyBoxMixinRenderObjectWithChildMixinRenderBox`1:paint(PaintingContext, Offset) (at Packages/com.unity.uiwidgets/Runtime/rendering/proxy_box.mixin.gen.cs:81)
Unity.UIWidgets.widgets.RenderCustomPaint:paint(PaintingContext, Offset) (at Packages/com.unity.uiwidgets/Runtime/rendering/custom_paint.cs:206)
Unity.UIWidgets.rendering.RenderObject:_paintWithContext(PaintingContext, Offset) (at Packages/com.unity.uiwidgets/Runtime/rendering/object.cs:1290)
Unity.UIWidgets.rendering.PaintingContext:paintChild(RenderObject, Offset) (at Packages/com.unity.uiwidgets/Runtime/rendering/object.cs:106)
Unity.UIWidgets.rendering.RenderProxyBoxMixinRenderObjectWithChildMixinRenderBox`1:paint(PaintingContext, Offset) (at Packages/com.unity.uiwidgets/Runtime/rendering/proxy_box.mixin.gen.cs:81)
Unity.UIWidgets.rendering.PaintingContext:pushLayer(ContainerLayer, PaintingContextCallback, Offset, Rect) (at Packages/com.unity.uiwidgets/Runtime/rendering/object.cs:246)
Unity.UIWidgets.rendering.RenderPhysicalShape:paint(PaintingContext, Offset) (at Packages/com.unity.uiwidgets/Runtime/rendering/proxy_box.cs:1562)
Unity.UIWidgets.rendering.RenderObject:_paintWithContext(PaintingContext, Offset) (at Packages/com.unity.uiwidgets/Runtime/rendering/object.cs:1290)
Unity.UIWidgets.rendering.PaintingContext:paintChild(RenderObject, Offset) (at Packages/com.unity.uiwidgets/Runtime/rendering/object.cs:106)
Unity.UIWidgets.rendering.RenderProxyBoxMixinRenderObjectWithChildMixinRenderBox`1:paint(PaintingContext, Offset) (at Packages/com.unity.uiwidgets/Runtime/rendering/proxy_box.mixin.gen.cs:81)
Unity.UIWidgets.rendering.RenderObject:_paintWithContext(PaintingContext, Offset) (at Packages/com.unity.uiwidgets/Runtime/rendering/object.cs:1290)
Unity.UIWidgets.rendering.PaintingContext:paintChild(RenderObject, Offset) (at Packages/com.unity.uiwidgets/Runtime/rendering/object.cs:106)
Unity.UIWidgets.rendering.RenderShiftedBox:paint(PaintingContext, Offset) (at Packages/com.unity.uiwidgets/Runtime/rendering/shifted_box.cs:69)
Unity.UIWidgets.rendering.RenderObject:_paintWithContext(PaintingContext, Offset) (at Packages/com.unity.uiwidgets/Runtime/rendering/object.cs:1290)
Unity.UIWidgets.rendering.PaintingContext:paintChild(RenderObject, Offset) (at Packages/com.unity.uiwidgets/Runtime/rendering/object.cs:106)
Unity.UIWidgets.rendering.RenderShiftedBox:paint(PaintingContext, Offset) (at Packages/com.unity.uiwidgets/Runtime/rendering/shifted_box.cs:69)
Unity.UIWidgets.rendering.RenderObject:_paintWithContext(PaintingContext, Offset) (at Packages/com.unity.uiwidgets/Runtime/rendering/object.cs:1290)
Unity.UIWidgets.rendering.PaintingContext:paintChild(RenderObject, Offset) (at Packages/com.unity.uiwidgets/Runtime/rendering/object.cs:106)
Unity.UIWidgets.rendering.RenderShiftedBox:paint(PaintingContext, Offset) (at Packages/com.unity.uiwidgets/Runtime/rendering/shifted_box.cs:69)
Unity.UIWidgets.rendering.RenderObject:_paintWithContext(PaintingContext, Offset) (at Packages/com.unity.uiwidgets/Runtime/rendering/object.cs:1290)
Unity.UIWidgets.rendering.PaintingContext:paintChild(RenderObject, Offset) (at Packages/com.unity.uiwidgets/Runtime/rendering/object.cs:106)
Unity.UIWidgets.rendering.RenderProxyBoxMixinRenderObjectWithChildMixinRenderBox`1:paint(PaintingContext, Offset) (at Packages/com.unity.uiwidgets/Runtime/rendering/proxy_box.mixin.gen.cs:81)
Unity.UIWidgets.rendering.RenderObject:_paintWithContext(PaintingContext, Offset) (at Packages/com.unity.uiwidgets/Runtime/rendering/object.cs:1290)
Unity.UIWidgets.rendering.PaintingContext:_repaintCompositedChild(RenderObject, Boolean, PaintingContext) (at Packages/com.unity.uiwidgets/Runtime/rendering/object.cs:81)
Unity.UIWidgets.rendering.PaintingContext:repaintCompositedChild(RenderObject, Boolean) (at Packages/com.unity.uiwidgets/Runtime/rendering/object.cs:48)
Unity.UIWidgets.rendering.PipelineOwner:flushPaint() (at Packages/com.unity.uiwidgets/Runtime/rendering/object.cs:525)
Unity.UIWidgets.rendering.RendererBinding:drawFrame() (at Packages/com.unity.uiwidgets/Runtime/rendering/binding.cs:114)
Unity.UIWidgets.widgets.WidgetsBinding:drawFrame() (at Packages/com.unity.uiwidgets/Runtime/widgets/binding.cs:200)
Unity.UIWidgets.rendering.RendererBinding:_handlePersistentFrameCallback(TimeSpan) (at Packages/com.unity.uiwidgets/Runtime/rendering/binding.cs:80)
Unity.UIWidgets.scheduler.SchedulerBinding:_invokeFrameCallback(FrameCallback, TimeSpan, String) (at Packages/com.unity.uiwidgets/Runtime/scheduler/binding.cs:726)
Unity.UIWidgets.scheduler.SchedulerBinding:handleDrawFrame() (at Packages/com.unity.uiwidgets/Runtime/scheduler/binding.cs:655)
Unity.UIWidgets.scheduler.SchedulerBinding:_handleDrawFrame() (at Packages/com.unity.uiwidgets/Runtime/scheduler/binding.cs:590)
Unity.UIWidgets.ui.Hooks:Window_drawFrame() (at Packages/com.unity.uiwidgets/Runtime/ui/hooks.cs:181)
zhuxingwei commented 2 years ago

Hi Thanks for the report!

We will look into this issue later today and let you know when it is fixed or further more information is required. Thanks !

zhuxingwei commented 2 years ago

Hi The issue has been fixed in #285. I also added an example for using backdropfilter in a widget app in the same PR, please check if you are interested.

tomcatter commented 2 years ago

@zhuxingwei 我使用最新的提交,这个问题解决了