注意:无特殊说明,Flutter版本及Dart版本如下:

  • Flutter版本: 1.12.13+hotfix.5
  • Dart版本: 2.7.0

ClipRect

ClipRect组件使用矩形裁剪子组件,通常情况下,ClipRect作用于CustomPaintCustomSingleChildLayoutCustomMultiChildLayoutAlignCenterOverflowBoxSizedOverflowBox组件,例如ClipRect作用于Align,可以仅显示上半部分,代码如下:

  1. ClipRect(
  2. child: Align(
  3. alignment: Alignment.topCenter,
  4. heightFactor: 0.5,
  5. child: Container(
  6. height: 150,
  7. width: 150,
  8. child: Image.asset(
  9. 'images/1.png',
  10. fit: BoxFit.cover,
  11. ),
  12. ),
  13. ),
  14. )

全图效果:

裁剪效果:

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

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

  • none:不裁剪,系统默认值,如果子组件不超出边界,此值没有任何性能消耗。
  • hardEdge:裁剪但不应用抗锯齿,速度比none慢一点,但比其他方式快。
  • antiAlias:裁剪而且抗锯齿,此方式看起来更平滑,比antiAliasWithSaveLayer快,比hardEdge慢,通常用于处理圆形和弧形裁剪。
  • antiAliasWithSaveLayer:裁剪、抗锯齿而且有一个缓冲区,此方式很慢,用到的情况比较少。

ClipRRect

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

用法如下:

  1. ClipRRect(
  2. borderRadius: BorderRadius.circular(20),
  3. child: Container(
  4. height: 150,
  5. width: 150,
  6. child: Image.asset(
  7. 'images/1.png',
  8. fit: BoxFit.cover,
  9. ),
  10. ),
  11. )

效果如图:

ClipOval

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

  1. ClipOval(
  2. child: Container(
  3. height: 150,
  4. width: 250,
  5. child: Image.asset(
  6. 'images/1.png',
  7. fit: BoxFit.cover,
  8. ),
  9. ),
  10. )

效果如下:

ClipPath

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

  1. ClipPath.shape(
  2. shape: StadiumBorder(),
  3. child: Container(
  4. height: 150,
  5. width: 250,
  6. child: Image.asset(
  7. 'images/1.png',
  8. fit: BoxFit.cover,
  9. ),
  10. ),
  11. )

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

  • RoundedRectangleBorder:圆角矩形

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

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

  • BeveledRectangleBorder:斜角矩形。效果如图:

  • CircleBorder:圆形。

CustomClipper

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

  1. @override
  2. Widget build(BuildContext context) {
  3. return Center(
  4. child: ClipPath(
  5. clipper: TrianglePath(),
  6. child: Container(
  7. height: 150,
  8. width: 250,
  9. child: Image.asset(
  10. 'images/1.png',
  11. fit: BoxFit.cover,
  12. ),
  13. ),
  14. ),
  15. );
  16. }

自定义TrianglePath代码如下:

  1. class TrianglePath extends CustomClipper<Path>{
  2. @override
  3. Path getClip(Size size) {
  4. var path = Path();
  5. path.moveTo(size.width/2, 0);
  6. path.lineTo(0, size.height);
  7. path.lineTo(size.width, size.height);
  8. return path;
  9. }
  10. @override
  11. bool shouldReclip(CustomClipper<Path> oldClipper) {
  12. return true;
  13. }
  14. }

效果如下:

我们还可以绘制五角星,代码如下:

  1. class StarPath extends CustomClipper<Path> {
  2. StarPath({this.scale = 2.5});
  3. final double scale;
  4. double perDegree = 36;
  5. /// 角度转弧度公式
  6. double degree2Radian(double degree) {
  7. return (pi * degree / 180);
  8. }
  9. @override
  10. Path getClip(Size size) {
  11. var R = min(size.width / 2, size.height / 2);
  12. var r = R / scale;
  13. var x = size.width / 2;
  14. var y = size.height / 2;
  15. var path = Path();
  16. path.moveTo(x, y - R);
  17. path.lineTo(x - sin(degree2Radian(perDegree)) * r,
  18. y - cos(degree2Radian(perDegree)) * r);
  19. path.lineTo(x - sin(degree2Radian(perDegree * 2)) * R,
  20. y - cos(degree2Radian(perDegree * 2)) * R);
  21. path.lineTo(x - sin(degree2Radian(perDegree * 3)) * r,
  22. y - cos(degree2Radian(perDegree * 3)) * r);
  23. path.lineTo(x - sin(degree2Radian(perDegree * 4)) * R,
  24. y - cos(degree2Radian(perDegree * 4)) * R);
  25. path.lineTo(x - sin(degree2Radian(perDegree * 5)) * r,
  26. y - cos(degree2Radian(perDegree * 5)) * r);
  27. path.lineTo(x - sin(degree2Radian(perDegree * 6)) * R,
  28. y - cos(degree2Radian(perDegree * 6)) * R);
  29. path.lineTo(x - sin(degree2Radian(perDegree * 7)) * r,
  30. y - cos(degree2Radian(perDegree * 7)) * r);
  31. path.lineTo(x - sin(degree2Radian(perDegree * 8)) * R,
  32. y - cos(degree2Radian(perDegree * 8)) * R);
  33. path.lineTo(x - sin(degree2Radian(perDegree * 9)) * r,
  34. y - cos(degree2Radian(perDegree * 9)) * r);
  35. path.lineTo(x - sin(degree2Radian(perDegree * 10)) * R,
  36. y - cos(degree2Radian(perDegree * 10)) * R);
  37. return path;
  38. }
  39. @override
  40. bool shouldReclip(StarPath oldClipper) {
  41. return oldClipper.scale != this.scale;
  42. }
  43. }

scale参数表示间隔的点到圆心的缩放比例,五角星效果如下:

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

  1. class StartClip extends StatefulWidget {
  2. @override
  3. State<StatefulWidget> createState() => _StartClipState();
  4. }
  5. class _StartClipState extends State<StartClip>
  6. with SingleTickerProviderStateMixin {
  7. AnimationController _controller;
  8. Animation _animation;
  9. @override
  10. void initState() {
  11. _controller =
  12. AnimationController(duration: Duration(seconds: 2), vsync: this)
  13. ..addStatusListener((status) {
  14. if (status == AnimationStatus.completed) {
  15. _controller.reverse();
  16. } else if (status == AnimationStatus.dismissed) {
  17. _controller.forward();
  18. }
  19. });
  20. _animation = Tween(begin: 1.0, end: 4.0).animate(_controller);
  21. _controller.forward();
  22. super.initState();
  23. }
  24. @override
  25. Widget build(BuildContext context) {
  26. return Center(
  27. child: AnimatedBuilder(
  28. animation: _animation,
  29. builder: (context, child) {
  30. return ClipPath(
  31. clipper: StarPath(scale: _animation.value),
  32. child: Container(
  33. height: 150,
  34. width: 150,
  35. color: Colors.red,
  36. ),
  37. );
  38. }),
  39. );
  40. }
  41. }

效果如下:

今天的文章对大家是否有帮助?如果有,请在文章底部留言和点赞,你们的留言、点赞和转发关注是我持续更新的动力!

欢迎您的加入Flutter的微信交流群(mqd_zzy),欢迎您的加入,让我们一起学习,一起进步,开始我们的故事,生活不止眼前的苟且,还有诗和《远方》。

当然我也非常希望您关注我个人的公众号,里面有各种福利等着大家哦。

更多相关阅读:

Flutter 裁剪类组件 最全总结的更多相关文章

  1. 你真的会用Flutter日期类组件吗

    Flutter系统提供了一些日期选择类组件,比如DayPicker.MonthPicker.YearPicker.showDatePicker.CupertinoDatePicker等,其中前4个为M ...

  2. Flutter 布局类组件:简介

    前言 布局类组件都会包含一个或多个子组件,不同的布局类组件对子组件排版(layout)方式不同. 我们知道,Element树才是最终的绘制树,Element树是通过Widget树来创建的(通过Widg ...

  3. Flutter 布局类组件:层叠布局(Stack和Positioned)

    前言 层叠布局,即子组件可以根据距父容器四个角的位置来确定自身的位置.绝对定位运行子组件堆叠起来,即按照代码中声明的顺序. Flutter中使用Stack和Positioned这两个组件来配合实现绝对 ...

  4. Flutter 布局类组件:流式布局(Wrap和Flow)

    前言 把超出屏幕显示范围会自动折行的布局称为流式布局.Flutter中通过Wrap和Flow来支持流式布局,将Row换成Wrap后溢出部分则会自动折行. Wrap 接口描述 Wrap({ Key ke ...

  5. Flutter 布局类组件:弹性布局(Flex)

    前言 弹性布局允许子组件按照一定比例来分配父容器空间,Flutter中的弹性布局主要通过Flex和Expanded来配合实现. Flex Flex组件可以沿着水平或垂直方向排列子组件,如果你知道主轴方 ...

  6. Flutter 布局类组件:线性布局(Row和Column)

    前言 所谓线性布局,即指沿水平或垂直方向排布子组件.Flutter中通过Row和Column来实现线性布局,并且它们都继承自弹性布局(Flex). 接口描述 Row({ Key key, // 表示子 ...

  7. 同学帮帮移动 H5 弹出层类组件:txbb-pop

    Txbb.Pop 同学帮帮弹出层类组件,简洁.无依赖,使用 CSS3 实现动画效果. 为什么要再造一遍轮子 弹出层是常见的业务场景,而且弹出层的业务场景很简单,没必要使用大而全的库,并且,我们经常会有 ...

  8. jmeter之JDBC类组件

    ~什么是JDBC?:全称名为Java DataBase Connectivity,(java数据库连接),在jmeter中是一种可以远程操作数据库的一类组件. ~jmeter如何操作数据库?:jmet ...

  9. PHP 类与对象 全解析(三)

    目录 PHP 类与对象 全解析( 一) PHP 类与对象 全解析( 二) PHP 类与对象 全解析(三 ) 13.魔术方法 定义:PHP把所有以__(两个下划线)开头的类方法当成魔术方法     __ ...

随机推荐

  1. Java操作redis客户端Jedis使用

    1.1   jedis介绍 Redis不仅是使用命令来操作,现在基本上主流的语言都有客户端支持,比如java.C.C#.C++.php.Node.js.Go等. 在官方网站里列一些Java的客户端,有 ...

  2. 对“深入理解 Java 内存模型(六)——final”的学习

    转载自https://www.infoq.cn/article/java-memory-model-6/ 与前面介绍的锁和 volatile 相比较,对 final 域的读和写更像是普通的变量访问.对 ...

  3. worship|spurs|drowns out|frauds|expell|spray with|deposit|moist|gave a sigh

    to have or show a strong feeling of respect and admiration for God or a god 敬奉,崇拜,信仰(上帝或神) On the is ...

  4. IE11阅读视图:带给你静心饕餮阅读大餐的片刻

    编者按:又到读书日,今天你挤出时间读书了吗?如今,越来越多人在习惯电子阅读,然而总难逃眼花缭乱的干扰信息.Internet Explorer 11新增阅读视图功能,一键开启,给你带给你静心饕餮阅读大餐 ...

  5. deeplearning.ai 神经网络和深度学习 week3 浅层神经网络

    1. 第i层网络 Z[i] = W[i]A[i-1] + B[i],A[i] = f[i](Z[i]). 其中, W[i]形状是n[i]*n[i-1],n[i]是第i层神经元的数量: A[i-1]是第 ...

  6. java 内存溢出-与gc

    感谢原作者 在日常中我们经常遇到这样的错误:java.lang.OutOfMemoryError: Java heap space. 但是除了heap space 的OutOfMemoryError, ...

  7. spring学习笔记四:spring常用注解总结

    使用spring的注解,需要在配置文件中配置组件扫描器,用于在指定的包中扫描注解 <context:component-scan base-package="xxx.xxx.xxx.x ...

  8. apache和tomcat的关系

    apache和tomcat的关系: 举个例子:apache是一辆卡车,上面可以装一些东西如html等.但是不能装水,要装水必须要有容器(桶),tomcat就是一个桶(装像JAVA这样的水),而这个桶也 ...

  9. docker 创建实例

    docker创建mysql实例要注意表名大小写和端口号映射的问题.下面是使用文件挂载解决表名大小写问题. docker run --name mysql-1 -e MYSQL_ROOT_PASSWOR ...

  10. Archives: 2013/6

    OpenStack环境搭建 这一步有两个选择: 一种就是正统的真实搭建,所有都按生产环境来部署,费时费力. 还有一种就是官方推荐的一键安装DevStack,直接安装最新的版本,体验最新的特性. 至于如 ...