ClipRect


ClipRect组件使用矩形裁剪子组件,通常情况下,ClipRect作用于CustomPaint 、 CustomSingleChildLayout 、 CustomMultiChildLayout 、 Align 、 Center 、 OverflowBox 、 SizedOverflowBox组件,例如ClipRect作用于Align,可以仅显示上半部分(可以通过alignment控制显示的位置),代码如下:

ClipRect(child: Align(alignment: Alignment.topCenter,heightFactor: 0.5,child: Container(height: 200,width: 200,child: Image.network('https://img2.baidu.com/it/u=1974206649,3691483036&fm=26&fmt=auto',fit: BoxFit.cover,),),),)

clipper参数定义裁剪规则,下面具体介绍。

clipBehavior参数定义了裁剪的方式,只有子控件超出父控件的范围才有裁剪的说法,各个方式说明如下:

  • none:不裁剪,系统默认值,如果子组件不超出边界,此值没有任何性能消耗。

  • hardEdge:裁剪但不应用抗锯齿,速度比none慢一点,但比其他方式快。

  • antiAlias:裁剪而且抗锯齿,此方式看起来更平滑,比antiAliasWithSaveLayer快,比hardEdge慢,通常用于处理圆形和弧形裁剪。

  • antiAliasWithSaveLayer:裁剪、抗锯齿而且有一个缓冲区,此方式很慢,用到的情况比较少。

ClipRRect


构造函数字段:

const ClipRRect({
    Key key,
    this.borderRadius = BorderRadius.zero,// 圆角
    this.clipper, // CustomClipper 对象,如果为空,则裁剪区域为 child 指定的大小
    this.clipBehavior = Clip.antiAlias,// 裁剪的方式, 不能为 null 或者 Clip.none
    Widget child,
  })

ClipRRect组件可以对子组件进行圆角裁剪,默认圆角半径为0,注意ClipRRect有2个R,不是上面介绍的ClipRect。

ClipRRect(borderRadius: BorderRadius.vertical(top: Radius.circular(20),bottom: Radius.circular(100)),child: Container(height: 300,width: 300,child:Image.network('https://img2.baidu.com/it/u=1974206649,3691483036&fm=26&fmt=auto',fit: BoxFit.cover,) ,),)

通过一下代码可以调整任何一个交的圆角裁剪:

borderRadius: BorderRadius.only(topLeft: Radius.circular(20),bottomLeft: Radius.circular(20),topRight: Radius.circular(40),bottomRight:Radius.circular(80)),

ClipOval


ClipOval裁剪为椭圆形,椭圆形的大小为正切父组件,因此如果父组件为正方形,切出来是圆形,用法如下:

ClipOval(child: Container(height: 200,width: 300,child: _image,),)

ClipPath


ClipPath组件根据路径进行裁剪,我们自定义裁剪路径也可以使用系统提供的,用法如下:

ClipPath.shape(child: Container(height: 200,width: 200,child: _image,), shape: StadiumBorder(),)

shape参数是ShapeBorder类型,系统已经定义了很多形状,介绍如下:

  • RoundedRectangleBorder:圆角矩形

  • ContinuousRectangleBorder:直线和圆角平滑连续的过渡,和RoundedRectangleBorder相比,圆角效果会小一些。

  • StadiumBorder:类似于足球场的形状,两端半圆。

  • BeveledRectangleBorder:斜角矩形。

CustomClipper


CustomClipper并不是一个组件,而是一个abstract(抽象)类,使用CustomClipper可以绘制出任何我们想要的形状,比如三角形,代码如下:

_buildClipCustom1(){return Center(child: ClipPath(clipper: MyClippper(),child: Container(height: 300,width: 300,child: _image,),),);}

自定义Myclipper代码如下:

class MyClippper extends CustomClipper<Path>{Path path =Path();@overridePath getClip(Size size) {Path path = Path();// 从 60,0 开始path.moveTo(60, 0);// 二阶贝塞尔曲线画弧path.quadraticBezierTo(0, 0, 0, 60);// 连接到底部path.lineTo(0, size.height / 1.2);// 三阶贝塞尔曲线画弧path.cubicTo(size.width / 4, size.height, size.width / 4 * 3, size.height / 1.5, size.width, size.height / 1.2);// 再连接回去path.lineTo(size.width, 60);// 再用二阶贝塞尔曲线画弧path.quadraticBezierTo(size.width - 60, 60, size.width - 60, 0);return path;}@overridebool shouldReclip(covariant CustomClipper<Path> oldClipper) {return false;// TODO: implement shouldReclip}}

效果如下:

绘制三角形:

class TrianglePath extends CustomClipper<Path>{@overridePath getClip(Size size) {var path = Path();path.moveTo(size.width/2, 0);path.lineTo(0, size.height);path.lineTo(size.width, size.height);return path;}@overridebool shouldReclip(CustomClipper<Path> oldClipper) {return true;}
}

绘制五角星:

class StarPath extends CustomClipper<Path> {StarPath({this.scale = 2.5});final double scale;double perDegree = 36;/// 角度转弧度公式double degree2Radian(double degree) {return (pi * degree / 180);}@overridePath getClip(Size size) {var R = min(size.width / 2, size.height / 2);var r = R / scale;var x = size.width / 2;var y = size.height / 2;var path = Path();path.moveTo(x, y - R);path.lineTo(x - sin(degree2Radian(perDegree)) * r,y - cos(degree2Radian(perDegree)) * r);path.lineTo(x - sin(degree2Radian(perDegree * 2)) * R,y - cos(degree2Radian(perDegree * 2)) * R);path.lineTo(x - sin(degree2Radian(perDegree * 3)) * r,y - cos(degree2Radian(perDegree * 3)) * r);path.lineTo(x - sin(degree2Radian(perDegree * 4)) * R,y - cos(degree2Radian(perDegree * 4)) * R);path.lineTo(x - sin(degree2Radian(perDegree * 5)) * r,y - cos(degree2Radian(perDegree * 5)) * r);path.lineTo(x - sin(degree2Radian(perDegree * 6)) * R,y - cos(degree2Radian(perDegree * 6)) * R);path.lineTo(x - sin(degree2Radian(perDegree * 7)) * r,y - cos(degree2Radian(perDegree * 7)) * r);path.lineTo(x - sin(degree2Radian(perDegree * 8)) * R,y - cos(degree2Radian(perDegree * 8)) * R);path.lineTo(x - sin(degree2Radian(perDegree * 9)) * r,y - cos(degree2Radian(perDegree * 9)) * r);path.lineTo(x - sin(degree2Radian(perDegree * 10)) * R,y - cos(degree2Radian(perDegree * 10)) * R);return path;}@overridebool shouldReclip(StarPath oldClipper) {return oldClipper.scale != this.scale;}
}

下面用动画动态设置scale,代码如下:

class StartClip extends StatefulWidget {const StartClip({Key? key}) : super(key: key);@override_StartClipState createState() => _StartClipState();
}class _StartClipState extends State<StartClip> with SingleTickerProviderStateMixin {late AnimationController _controller;late Animation _animation;@overridevoid initState() {// TODO: implement initStatesuper.initState();_controller = AnimationController(vsync: this,duration: Duration(seconds: 2))..addStatusListener((status) {if(status == AnimationStatus.completed){_controller.reset();}else if(status == AnimationStatus.dismissed){_controller.forward();}});_animation = Tween(begin: 1,end: 3.0).animate(_controller);_controller.forward();}@overrideWidget build(BuildContext context) {return Center(child: AnimatedBuilder(builder: (context,child){return ClipPath(clipper: StarPath(scale: _animation.value),child: Container(height: 150,width: 150,color: Colors.red,),);},animation: _animation,),);}
}

15、 Flutter Widgets 之 ClipRect,ClipRRect,ClipOval,ClipPath,CustomClipper,裁剪组件相关推荐

  1. Flutter widgets 快问快答 | 第一期

    想打造精彩的 Flutter 应用,离不开对各种 widget 的熟练使用.Flutter widget 短视频系列已经在 B 站连载一段时间了,这里我们为大家带来近期观看最多的三个 widget 的 ...

  2. Flutter Widgets 之 Expanded和Flexible

    注意:无特殊说明,Flutter版本及Dart版本如下: Flutter版本: 1.12.13+hotfix.5 Dart版本: 2.7.0 Expanded和Flexible是控制Row.Colum ...

  3. 【Flutter】Hero 动画 ( Hero 实现径向动画 | Hero 组件 createRectTween 设置 )

    文章目录 ◯.Hero 构造函数 一.圆形方形组件 二.创建页面 1 的组件 ( Hero 组件 1 ) 三.创建页面 2 的组件 ( Hero 组件 2 ) 四.完整代码示例 五.相关资源 ◯.He ...

  4. flutter 布局 Stack Positioned的混合操作 两个组件Container重叠 构建背景圆角操作 类似css的relative

    flutter 布局 Stack Positioned的混合操作 两个组件Container重叠 构建背景圆角操作 首先看一下需求 需要在这里加一个背景圆角,涉及到两个组件Container的重叠 我 ...

  5. Flutter Widgets 之 Container

    注意:无特殊说明,Flutter版本及Dart版本如下: Flutter版本: 1.12.13+hotfix.5 Dart版本: 2.7.0 Container将会是我们以后最常用的控件之一,Cont ...

  6. 6、Flutter Widgets 之 InkWell 和 Ink

    InkWell 参数详解 属性    详解 child    子组件 onTap    点击监听() onDoubleTap    双击监听 onLongPress    长按监听 onTapDown ...

  7. Flutter Widgets 之 RichText

    注意:无特殊说明,Flutter版本及Dart版本如下: Flutter版本: 1.12.13+hotfix.5 Dart版本: 2.7.0 基础用法 应用程序离不开文字的展示,因此文字的排版非常重要 ...

  8. 18、 Flutter Widgets 之 内置各种show

    flutter内置了各种类型的show弹框,可以增加开发效率.以下是每种show的基本用法. showDialog showDialog(context: context, builder: (con ...

  9. Flutter Widgets 之 SafeArea

    注意:无特殊说明,Flutter版本及Dart版本如下: Flutter版本: 1.12.13+hotfix.5 Dart版本: 2.7.0 现如今的手机已经不能提供给应用程序规整的矩形界面了,一些带 ...

最新文章

  1. SAP 权限对象设置及在程序中的应用
  2. web前端怎么获取cookie?新手前端开发者需了解
  3. 创建一个Business partner reference extension field
  4. [零基础学JAVA]Java SE应用部分-35.JAVA类集之四
  5. atom 快速编写html,Atom 编辑器自定义代码段(snippet)
  6. 云小课 | 一个三分钟快速定制OCR应用的神器,要不?
  7. NodeJs将项目上传至服务器
  8. 有哪些开源C ++静态分析工具? [关闭]
  9. Spring事务管理2----编程式事务管理
  10. 使用cxf框架搭建webservice
  11. Python小实验2—产生式系统实验
  12. 国内坐标转换常用投影EPSG
  13. 为N台linux服务器传输大文件
  14. linux下调试paddlelite源码,Lite v2.7 v2.8 端侧部署 Ubuntu编译失败
  15. 2020-12-09 blastp参数学习
  16. PyCharm自动添加作者注释
  17. 在线文库源码php,在线文库网站 文档分享平台网站 在线文档 在线预览网站 源码...
  18. js对象:实现继承的几种方式及优缺点
  19. 基于javaweb的超市收银管理系统(java+ssm+html+mysql)
  20. 百度智能云 × 沛县 | 数据治理成就新城市

热门文章

  1. 可充电电池安规认证标准、GB 9706.1-2020对医用电气设备中电池的要求
  2. linux python 调试_Python安装与环境配置
  3. jquery触屏幻灯片
  4. 中国研制成功人工智能探地雷达 可为地下空间做“体检”
  5. IONIC4 苹果登录-Sign In With Apple Id
  6. 通过wifi进行adb远程连接手机进行调试
  7. Python,字符串前缀u r b f
  8. 【深度好文】Python图像处理之物体标识与面积测量
  9. 周昆 浙江大学计算机学院院长,浙江大学周昆教授来校作学术报告
  10. mt9638和t972哪个好