Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/110.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何从自定义绘制小部件更改为剪辑路径小部件?_Android_Ios_Flutter_Dart - Fatal编程技术网

Android 如何从自定义绘制小部件更改为剪辑路径小部件?

Android 如何从自定义绘制小部件更改为剪辑路径小部件?,android,ios,flutter,dart,Android,Ios,Flutter,Dart,这是我的原始代码,出于某些原因,我需要将其更改为clip path小部件。 作为一个初学者,这真的很难。。。 (顺便说一句,sSize是屏幕大小,而不是画布大小) class CoverClipper扩展了CustomClipper{ @凌驾 路径getClip(大小){ //最终路径=路径(); 最后的双精度r=(size.width).toDouble()/6.8; 联合收割机( 病理手术, Path()…addRect(Rect.fromLTRB(size.width/2-r,0.6*si

这是我的原始代码,出于某些原因,我需要将其更改为clip path小部件。 作为一个初学者,这真的很难。。。 (顺便说一句,sSize是屏幕大小,而不是画布大小)

class CoverClipper扩展了CustomClipper{
@凌驾
路径getClip(大小){
//最终路径=路径();
最后的双精度r=(size.width).toDouble()/6.8;
联合收割机(
病理手术,
Path()…addRect(Rect.fromLTRB(size.width/2-r,0.6*size.height-90-r,size.width/2+r,0.6*size.height-90+r)),
路径()
..添加椭圆(从圆开始的矩形)(
中心:偏移(尺寸.宽度/2,1.2/2*尺寸.高度-90),
半径:尺寸。宽度/6.8)
…关闭()
);
返回路径();
}
@凌驾
bool shouldReclip(CustomClipper oldClipper){
返回false;
}
}
我试着这样做,但什么也没发生。 没有错误,但什么也没有显示

class CoverClipper extends CustomClipper<Path> {
  @override
  Path getClip(Size size) {
    //final path = Path();
    final double r = (size.width).toDouble()/6.8;

    Path.combine(
        PathOperation.difference,
        Path()..addRect(Rect.fromLTRB(size.width/2-r, 0.6*size.height-90-r, size.width/2+r, 0.6*size.height-90+r)),
        Path()
          ..addOval(Rect.fromCircle(
              center: Offset(size.width / 2, 1.2/2*size.height-90 ),
              radius: size.width/6.8))
          ..close()
    );
    return Path();
  }

  @override
  bool shouldReclip(CustomClipper<Path> oldClipper) {
    return false;
  }
}
class\u Layer2State扩展状态{
@凌驾
小部件构建(构建上下文){
最终大小=widget.Size;
//返回CustomPaint(油漆工:CoverPaint(sSize:尺寸));
返回ClipPath(
裁剪器:CoverClipper(),
子:容器(
颜色:颜色,白色,
高度:size.height,
宽度:size.width,
),
);
}
}
事实上,我对克利帕斯一无所知。
我需要帮助……

您需要返回您要修改的实际路径,它将正常工作。返回的当前路径为空路径:

class _Layer2State extends State<Layer2> {
  @override
  Widget build(BuildContext context) {
    final Size size = widget.size;

    // return CustomPaint(painter: CoverPainter(sSize: size));

    return ClipPath(
      clipper: CoverClipper(),
      child: Container(
        color: Colors.white,
        height: size.height,
        width: size.width,
      ),
    );
  }
}
class CoverClipper扩展了CustomClipper{
@凌驾
路径getClip(大小){
最后的双精度r=(size.width).toDouble()/6.8;
返回路径.combine(
病理手术,
Path()…addRect(Rect.fromLTRB(size.width/2-r,0.6*size.height-90-r,size.width/2+r,0.6*size.height-90+r)),
路径()
..添加椭圆(从圆开始的矩形)(
中心:偏移(尺寸.宽度/2,1.2/2*尺寸.高度-90),
半径:尺寸。宽度/6.8)
…关闭()
);
}
@凌驾
bool shouldReclip(CustomClipper oldClipper){
return true;//您还可以将其更改为true以重新绘制。
}
}

您正在返回一个空路径():return Path();。。。您应该返回您创建的一个。更改代码如下:return Path.combine(~~~);没有发生任何事情啊,对不起,它起作用了,谢谢你的建议如果你写下这篇评论作为回答,我会选择它作为我问题的答案
class _Layer2State extends State<Layer2> {
  @override
  Widget build(BuildContext context) {
    final Size size = widget.size;

    // return CustomPaint(painter: CoverPainter(sSize: size));

    return ClipPath(
      clipper: CoverClipper(),
      child: Container(
        color: Colors.white,
        height: size.height,
        width: size.width,
      ),
    );
  }
}
class CoverClipper extends CustomClipper<Path> {
  @override
  Path getClip(Size size) {
    final double r = (size.width).toDouble()/6.8;

    return Path.combine(
        PathOperation.difference,
        Path()..addRect(Rect.fromLTRB(size.width/2-r, 0.6*size.height-90-r, size.width/2+r, 0.6*size.height-90+r)),
        Path()
          ..addOval(Rect.fromCircle(
              center: Offset(size.width / 2, 1.2/2*size.height-90 ),
              radius: size.width/6.8))
          ..close()
    );
  }

  @override
  bool shouldReclip(CustomClipper<Path> oldClipper) {
    return true; // you can also change this to true to repaint.
  }
}