我们常用的BoxDecoration可以实现这些功能

const BoxDecoration({
    this.color, // 底色
    this.image, // 图片
    this.border, 边色
    this.borderRadius, // 圆角度
    this.boxShadow, // 阴影
    this.gradient, // 渐变
    this.backgroundBlendMode, // 混合Mode
    this.shape = BoxShape.rectangle,  // 形状
  })

有些特殊的背景需要,比如:

要实现上面的背景框,可以通过自定义decoration,通过canvas和painter实现,代码如下:

import 'package:flutter/material.dart';class CustomDecoration extends Decoration {final double marginLeft;//顶角离左边的距离final Color lineColor;final double height;//顶角高度final double radius;//边框圆角大小CustomDecoration({required this.marginLeft,this.radius = 8,this.lineColor = Colors.black,this.height = 16});@overrideBoxPainter createBoxPainter([VoidCallback? onChanged]) {// TODO: implement createBoxPainterreturn _CustomPainter(this, marginLeft, lineColor, radius, height);}
}class _CustomPainter extends BoxPainter {final CustomDecoration customDecoration;Paint? painter;final double marginLeft;final Color lineColor;final double height;final double radius;_CustomPainter(this.customDecoration, this.marginLeft, this.lineColor,this.radius, this.height): painter = Paint()..color = lineColor..strokeWidth = 1..style = PaintingStyle.stroke;@overridevoid paint(Canvas canvas, Offset offset, ImageConfiguration configuration) {var size = configuration.size;Offset leftTop = offset;Offset rightTop = leftTop.translate(size!.width, 0);Offset leftBottom = leftTop.translate(0, size.height);Offset rightBottom = leftTop.translate(size.width, size.height);final leftStart = leftTop.translate(radius, 0); //点1final leftPoint = leftTop.translate(marginLeft, 0); //点2final topPoint = leftPoint.translate(height, -height); // 点3final rightPoint = leftPoint.translate(height*2, 0); // 点4final top5 = rightTop.translate(-radius, 0);final top6 = rightTop.translate(0, radius);final bottom7 = rightBottom.translate(0, -radius);final bottom8 = rightBottom.translate(-radius, 0);final bottom9 = leftBottom.translate(radius, 0);final bottom10 = leftBottom.translate(0, -radius);final top11 = leftTop.translate(0, radius);final path = Path()..moveTo(leftStart.dx, leftStart.dy)..lineTo(leftPoint.dx, leftPoint.dy)..lineTo(topPoint.dx, topPoint.dy)..lineTo(rightPoint.dx, rightPoint.dy)..lineTo(top5.dx, top5.dy)..arcToPoint(top6, radius: Radius.circular(radius))..lineTo(bottom7.dx, bottom7.dy)..arcToPoint(bottom8, radius: Radius.circular(radius))..lineTo(bottom9.dx, bottom9.dy)..arcToPoint(bottom10, radius: Radius.circular(radius))..lineTo(top11.dx, top11.dy)..arcToPoint(leftStart, radius: Radius.circular(radius));canvas.drawPath(path, painter!..style = PaintingStyle.stroke);}
}
OK,以上demo主要通过canvas的drawPath方法直接路径绘制出来,也可以按照这个思路绘制其他复杂的边框。此实例仅供参考!

Flutter自定义Decoration实现特殊的背景框相关推荐

  1. Flutter 自定义Decoration

    Flutter 中 可以给Container设置decoration来设置背景,边框等等效果,非常方便. Container(decoration: TestDecoration(),); 但是Flu ...

  2. Flutter 自定义组件实战之Cupertino(iOS)风格的复选框

    继上一篇Flutter自定义组件的视频短课(视频地址: https://www.bilibili.com/video/BV1ap4y1U7UB/ )后,我们继续来聊自定义组件.视频中我为大家详解了Cu ...

  3. Flutter 画笔绘制二维码扫描框

    文章目录 一.CustomPaint介绍 1. CustomPaint 2. CustomPainter 3. Paint & Canvas 4. 示例(绘制文本背景) 二.计算扫描框四个点坐 ...

  4. flutter 自定义日历

    在项目中需要实现一个日历展示我发布过的动态,效果如图,同时需要左右滑动翻页 尝试使用组件发现可自定义的范围比较小,且无法实现需求,看到这篇Flutter自定义日历,实现日期底部不同颜色的日历事件_ap ...

  5. Flutter之Decoration

    1.不废话,先爆照看效果 2.Decoration介绍 Flutter的Decoration可以设置:背景色 背景图 边框 圆角 阴影 渐变色 的等属性,有点像android里面的shape,Deco ...

  6. android TextView下划线,圆角边框,数逐字显示,虚线边框, 渐变色背景框, 阴影背景框

    长方形 <?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="h ...

  7. Flutter 自定义Widget——风车实现

    最近在做一个天气模块的时候,风力需要显示一个旋转的风车,实现效果如下: 需求分析 我们可以把上面的效果拆分为两个部分实现: 1.画一个风车的FanWidget 2.旋转动画 一.风车Widget实现 ...

  8. 自定义 FlowLayout流式布局搜索框 加 GreenDao存取搜索记录,使用RecyclerView展示

    输入框布局的shape <?xml version="1.0" encoding="utf-8"?> <shape xmlns:android ...

  9. flutter自定义单元格_使用自定义大小的单元格制作复杂的UICollectionView布局(第1部分)

    flutter自定义单元格 Recently I built a screen with a pretty complex layout containing self sizing cells. I ...

最新文章

  1. Thinkphp框架中D()和M()的区别
  2. 你必须知道的10个提高Canvas性能技巧
  3. linux服务媒体,安装和使用Jellyfin配置Linux媒体服务器
  4. Win10开机一直转圈圈怎么办?一直转圈进不去系统的解决方法
  5. python生成json_python之生成多层json结构的实现
  6. 【转载】用平常语言介绍神经网络
  7. 10 分钟让你明白 MySQL 是如何利用索引的
  8. 网络舆情监测系统TOOM
  9. 流量治理神器-Sentinel限流熔断应用实战
  10. NPAPI和PPAPI插件开发
  11. 程序员找媳妇的要求是什么呢?
  12. 性价比高的骨传导耳机,国产top1品牌推荐
  13. 关于部分小米机型沉浸式图标变色失败的解决方式
  14. 身份证号验证(正则升级版)
  15. C4D透视图设置背景图,实景合成小技巧。
  16. ASP.NET网站实现中英文转换(本地化资源)
  17. matlab atem(),一种直接计算ATEM传输室谐振频率的简单方法
  18. rust火箭基地主楼开启方法_VCI TECTONIC 509 防锈涂料
  19. 嵌入式 ARM 编译器
  20. linux安装f77编译器,CentOS下安装gcc /g++ /gfortran /g77 编译器

热门文章

  1. asp.net 页面加载
  2. 台式计算机一般多大功率,电脑的功率有多大,台式电脑的功率是多少
  3. Plupload中文文档
  4. CubeFS存储技术揭密(1) — 纠删码引擎系统设计
  5. 离散数学实验(三)集合的基本运算
  6. CSS正方体背面不可见
  7. 关于架构的胡言乱语(下)
  8. 【算法和数据结构学习笔记】整合版
  9. 开尔文夹接线图解_什么是开尔文四线检测|Kelvin Four-terminal sensing|开尔文|Kelvin 4|开尔文四线电阻检测-产品知识-资讯-深圳华壬电子...
  10. kelvin 四线连接电阻测试法