Flutter 36: 图解自定义 View 之 Canvas (三)

简介: 0 基础学习 Flutter,第三十六步:自定义 View 第四节~

      小菜继续学习 Canvas 的相关方法:

drawVertices 绘制顶点

      小菜上次没有整理 drawVertices 的绘制方法,这次补上;Vertice 即顶点,通过绘制多个顶点,在进行连线,多用于 3D 模型中;

      drawVertices 包括三个参数,第一个是顶点属性,根据不同属性线的连接方式也不同;第二个是混合模式,即线的颜色与背景色混合效果;第三个是画笔,小菜测试调整 Paint 线的粗细无法调整整体连线的粗细;

      小菜借用 A B C D E F G H I 顶点来简单介绍:

  1. VertexMode.triangles:每三个分割顶点相连,即 [A B C] [D E F] [G H I] 共 3 组;
  2. VertexMode.triangleStrip:每相邻的三个顶点相连,即 [A B C] [B C D] [C D E] [D E F] [E F G] [F G H] [G H I] 共 7 组;
  3. VertexMode.triangleFan:每相邻的两个顶点与首点相连,即 [A B C] [A C D] [A D E] [A E F] [A F G] [A G H] [A H I] 共 7 组;
canvas.drawVertices(
    Vertices(VertexMode.triangles, [
      Offset(30, 30), Offset(30, 60),Offset(60, 60),
      Offset(90, 60), Offset(120, 60), Offset(120, 30),
      Offset(60, 90), Offset(60, 120), Offset(90, 120),
    ]),
    BlendMode.colorBurn, Paint()..color = Colors.red);

canvas.drawVertices(
    Vertices(VertexMode.triangleStrip, [
      Offset(210, 30), Offset(210, 60), Offset(240, 60),
      Offset(270, 60), Offset(300, 60), Offset(300, 30),
      Offset(240, 90), Offset(240, 120), Offset(270, 120),
    ]),
    BlendMode.colorBurn, Paint()..color = Colors.green);

canvas.drawVertices(
    Vertices(VertexMode.triangleFan, [
      Offset(120, 150), Offset(120, 180), Offset(150, 180),
      Offset(180, 180), Offset(210, 180), Offset(210, 150),
      Offset(150, 210), Offset(150, 240), Offset(180, 240),
    ]),
    BlendMode.colorBurn, Paint()..color = Colors.blue);

画布操作

      小菜接下来介绍一下画布的基本操作,与 Android 很相似;

scale 缩放

      scale 即缩放效果,缩放的是画布大小,可以设置缩放倍数,且缩放倍数会叠加;

canvas.drawRect(
    Rect.fromLTWH(60, 60, 90, 50),
    Paint()..color = Colors.red
      ..strokeWidth = 2.0..style = PaintingStyle.stroke);
// 缩放
canvas.scale(2);

canvas.drawRect(
    Rect.fromLTWH(60, 60, 90, 50),
    Paint()..color = Colors.red
      ..strokeWidth = 2.0..style = PaintingStyle.stroke);
// 缩放
canvas.scale(0.25);

canvas.drawRect(
    Rect.fromLTWH(60, 60, 90, 50),
    Paint()..color = Colors.red
      ..strokeWidth = 2.0..style = PaintingStyle.stroke);

translate 平移

      translate 即平移,平移的也是画布,并非画布中子元素,两个参数分别为水平方向和竖直方向距离;

canvas.drawLine(
    Offset(0, 0), Offset(60, 60),
    Paint()..color = Colors.red..strokeWidth = 2);
canvas.drawRect(
    Rect.fromLTWH(60, 60, 90, 50),
    Paint()..color = Colors.red
      ..strokeWidth = 2.0..style = PaintingStyle.stroke);
// 平移
canvas.translate(30, 90);

canvas.drawLine(
    Offset(0, 0), Offset(0, Screen.height),
    Paint()..color = Colors.blueGrey..strokeWidth = 2);
canvas.drawLine(
    Offset(0, 0), Offset(Screen.width, 0),
    Paint()..color = Colors.blueGrey..strokeWidth = 2);
canvas.drawLine(
    Offset(0, 0), Offset(60, 60),
    Paint()..color = Colors.red..strokeWidth = 2);
canvas.drawRect(
    Rect.fromLTWH(60, 60, 90, 50),
    Paint()..color = Colors.red
      ..strokeWidth = 2.0.style = PaintingStyle.stroke);

rotate 旋转

      rotate 即旋转,原点为屏幕左上角,小菜为了效果先将画布平移一部分到屏幕中间在进行旋转测试,注意参数并非角度而是对应的 PI 值;

canvas.drawLine(
    Offset(0, 0), Offset(60, 60),
    Paint()..color = Colors.red..strokeWidth = 2);
canvas.drawRect(
    Rect.fromLTWH(60, 60, 90, 50),
    Paint()..color = Colors.red
      ..strokeWidth = 2.0..style = PaintingStyle.stroke);
// 以当前原点旋转 90 度
canvas.rotate(degToRad(90));

canvas.drawLine(
    Offset(0, 0), Offset(60, 60),
    Paint()..color = Colors.green..strokeWidth = 2);
canvas.drawRect(
    Rect.fromLTWH(60, 60, 90, 50),
    Paint()..color = Colors.green
      ..strokeWidth = 2.0..style = PaintingStyle.stroke);

skew 斜切

      skew 即斜切,两个参数为水平方向和竖直方向切度值,值为三角函数中的 tan 值,即 45 度时 tan 值为 1

canvas.drawRect(
    Rect.fromLTWH(60, 0, 90, 50),
    Paint()..color = Colors.red
      ..strokeWidth = 2.0..style = PaintingStyle.stroke);
// 水平方向斜近 30 度,竖直方向不变
canvas.skew(0.6, 0);

canvas.drawRect(
    Rect.fromLTWH(60, 0, 90, 50),
    Paint()..color = Colors.green
      ..strokeWidth = 2.0..style = PaintingStyle.stroke);

save/restore 保存/恢复

      save/savelayer 即保存当前画布,restore 即恢复当前画布,也可以理解为清空重新绘制;save/restore 可以多次,以栈的方式存储,可以通过进栈/出栈到当具体某一层;但是小菜测试时发现与 save/restore 需要成对出现,否则回报不匹配异常;

canvas.clipRect(Rect.fromLTWH(40, 40, Screen.width - 80, Screen.width - 80));
canvas.drawColor(Colors.green, BlendMode.srcIn);
// 保存画布1
canvas.save();

canvas.clipRect(
    Rect.fromLTWH(60, 60, Screen.width - 120, Screen.width - 120));
canvas.drawColor(Colors.grey, BlendMode.srcIn);
// 保存画布2
canvas.save();
canvas.clipRect(
    Rect.fromLTWH(80, 80, Screen.width - 160, Screen.width - 160));
canvas.drawColor(Colors.orange, BlendMode.srcIn);
//  canvas.save();
// 恢复画布1
canvas.restore();
// 恢复画布2
canvas.restore();
//  canvas.restore();
canvas.drawColor(Colors.blue, BlendMode.srcIn);



      Canvas 非常强大,还有很多研究不透彻的地方,小菜仍在不断学习,有错误的地方烦请多多指点!

目录
相关文章
|
1月前
|
UED 开发者 容器
Flutter&鸿蒙next 的 Sliver 实现自定义滚动效果
Flutter 提供了强大的滚动组件,如 ListView 和 GridView,但当需要更复杂的滚动效果时,Sliver 组件是一个强大的工具。本文介绍了如何使用 Sliver 实现自定义滚动效果,包括 SliverAppBar、SliverList 等常用组件的使用方法,以及通过 CustomScrollView 组合多个 Sliver 组件实现复杂布局的示例。通过具体代码示例,展示了如何实现带有可伸缩 AppBar 和可滚动列表的页面。
110 1
|
1月前
Flutter 自定义组件继承与调用的高级使用方式
本文深入探讨了 Flutter 中自定义组件的高级使用方式,包括创建基本自定义组件、继承现有组件、使用 Mixins 和组合模式等。通过这些方法,您可以构建灵活、可重用且易于维护的 UI 组件,从而提升开发效率和代码质量。
131 1
|
1月前
|
前端开发 开发者
深入探索 Flutter 鸿蒙版的画笔使用与高级自定义动画
本文深入探讨了 Flutter 中的绘图功能,重点介绍了 CustomPainter 和 Canvas 的使用方法。通过示例代码,详细讲解了如何绘制自定义图形、设置 Paint 对象的属性以及实现高级自定义动画。内容涵盖基本绘图、动画基础、渐变动画和路径动画,帮助读者掌握 Flutter 绘图与动画的核心技巧。
80 1
|
1月前
|
Dart UED 开发者
Flutter&鸿蒙next中的按钮封装:自定义样式与交互
在Flutter应用开发中,按钮是用户界面的重要组成部分。Flutter提供了多种内置按钮组件,但有时这些样式无法满足特定设计需求。因此,封装一个自定义按钮组件变得尤为重要。自定义按钮组件可以确保应用中所有按钮的一致性、可维护性和可扩展性,同时提供更高的灵活性,支持自定义颜色、形状和点击事件。本文介绍了如何创建一个名为CustomButton的自定义按钮组件,并详细说明了其样式、形状、颜色和点击事件的处理方法。
86 1
|
1月前
|
Dart 搜索推荐 API
Flutter & 鸿蒙next版本:自定义对话框与表单验证的动态反馈与错误处理
在现代移动应用开发中,用户体验至关重要。本文探讨了如何在 Flutter 与鸿蒙操作系统(HarmonyOS)中创建自定义对话框,并结合表单验证实现动态反馈与错误处理,提升用户体验。通过自定义对话框和表单验证,开发者可以提供更加丰富和友好的交互体验,同时利用鸿蒙next版本拓展应用的受众范围。
84 1
|
2月前
|
UED 开发者
flutter:view (九)
本文介绍了Flutter中多种滚动组件的使用方法,包括`SliverAppBar`、`PageView`、`NestedScrollView`、`ListView`、`GridView`、`SingleChildScrollView`等。具体展示了如何构建可滑动的页面布局,如实现下拉刷新、无限循环的轮播图、带标题栏的嵌套滑动视图、列表视图的不同形式(如水平列表、带有分隔线的列表)以及自定义的滚动视图。还提供了监听滚动距离、滑动到指定位置等高级功能的实现代码示例。这些组件和技巧对于开发具有丰富交互效果的移动应用非常有用。
|
3月前
|
前端开发 搜索推荐
Flutter中自定义气泡框效果的实现
Flutter中自定义气泡框效果的实现
114 3
|
4月前
|
开发者 监控 开发工具
如何将JSF应用送上云端?揭秘在Google Cloud Platform上部署JSF应用的神秘步骤
【8月更文挑战第31天】本文详细介绍如何在Google Cloud Platform (GCP) 上部署JavaServer Faces (JSF) 应用。首先,确保已准备好JSF应用并通过Maven构建WAR包。接着,使用Google Cloud SDK登录并配置GCP环境。然后,创建`app.yaml`文件以配置Google App Engine,并使用`gcloud app deploy`命令完成部署。最后,通过`gcloud app browse`访问应用,并利用GCP的监控和日志服务进行管理和故障排查。整个过程简单高效,帮助开发者轻松部署和管理JSF应用。
64 0
|
前端开发 vr&ar 容器
Flutter 115: 图解自定义 View 之 Canvas (四) drawParagraph
0 基础学习 Flutter,第一百一十五节:自定义 Canvas 第四节,文本绘制小结!
674 0
Flutter 115: 图解自定义 View 之 Canvas (四) drawParagraph
|
前端开发 Android开发 iOS开发
Flutter 35: 图解自定义 View 之 Canvas (二)
0 基础学习 Flutter,第三十五步:自定义 View 第三节~
4715 0