前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Flutter 自定义 View 介绍

Flutter 自定义 View 介绍

原创
作者头像
CatEatFish
修改2020-07-09 14:23:56
1K0
修改2020-07-09 14:23:56
举报
文章被收录于专栏:干活分享干活分享

前提

对于一些复杂或不规则的UI,我们可能无法使用现有的 Widget 组合去实现,比如需要一个带动画的进度条,

又或者是一个特殊形状的多边形等等,当然有时候我们可以直接用图片去实现,但是并没有达到我们想要

的效果,反而会让我们产生不良的体验。

几乎所有的UI系统都会提供一个自绘UI的接口,这个接口通常会提供一块2D画布Canvas,Canvas内部封装了

一些基本绘制的API,开发者可以通过Canvas绘制各种自定义图形。在Flutter中,提供了一个CustomPaint Widget,

它可以结合一个画笔CustomPainter来实现绘制自定义图形。

CustomPaint 与 Canvas

CustomPaint

我们看看 CustomPaint 构造函数:

代码语言:txt
复制
const CustomPaint({
    Key key,
    this.painter,
    this.foregroundPainter,
    this.size = Size.zero,
    this.isComplex = false,
    this.willChange = false,
    Widget child, //子节点,可以为空
  })

1.painter: 背景画笔,会显示在子节点后面;

2.foregroundPainter: 前景画笔,会显示在子节点前面

3.size:当child为null时,代表默认绘制区域大小,如果有child则忽略此参数,画布尺寸则为child尺寸。如果有child但是想指定画布为特定大小,可以使用SizeBox包裹CustomPaint实现。

4.isComplex:是否复杂的绘制,如果是,Flutter会应用一些缓存策略来减少重复渲染的开销。

5.willChange:和isComplex配合使用,当启用缓存时,该属性代表在下一帧中绘制是否会改变。

可以看到,绘制时我们需要提供前景或者背景画笔,两者也可以同时提供,

我们的画笔需要继承 CustomPainter 类,我们在画笔类中实现真正的绘制逻辑。

注意
  1. 一般child属性我们一般不填,即使你是想要在你的CustomPaint上添加一些其他的布局,也不建议放在child属中。
  2. size尺寸最好给定,计算一下布局的宽高,设定一下。
Canvas

顾名思义画布的意思,我们绘制布局当然是在一张画布上进行绘制,画布为我们绘制图形提供了很多方法。(熟悉画布的就无需再看了)

代码语言:txt
复制
//包含了常规图形(具体参数不做介绍)
drawLine   | 画线 
drawPoint  | 画点 
drawPath   | 画路径 
drawImage  | 画图像 
drawRect   | 画矩形 
drawCircle | 画圆 
drawOval   | 画椭圆 
drawArc    | 画圆弧

在绘制之前我们需要准备画笔 Paint,就如画画一样,你用什么笔就能画什么样的画,在Paint中,

我们可以配置画笔的各种属性如粗细、颜色、样式等。如:

代码语言:txt
复制
var paint = Paint() //创建一个画笔并配置其属性
  ..isAntiAlias = true //是否抗锯齿
  ..style = PaintingStyle.fill //画笔样式:填充
  ..color=Color(0x77cdb175);//画笔颜色
  ..strokeWidth = 10.0;//画笔的宽度

好了,继承CustomPainter类,然后准备好画笔,就可以在画布上尽情的挥洒了!

写的挺简单的,就是介绍了一下自定义view的准备工作以及画布画笔的功能,具体实战请看下一篇博客。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前提
  • CustomPaint 与 Canvas
    • CustomPaint
      • 注意
    • Canvas
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档