Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >Flutter:如何使用 CustomPaint 绘制心形

Flutter:如何使用 CustomPaint 绘制心形

原创
作者头像
徐建国
修改于 2021-10-18 02:37:28
修改于 2021-10-18 02:37:28
1K00
代码可运行
举报
文章被收录于专栏:个人路线个人路线
运行总次数:0
代码可运行

“ 作为程序员其实也有浪漫的一幕,今天我们一起借助CustomPaintCustomPainter绘制心形,本文将带您了解在 Flutter 中使用CustomPaintCustomPainter绘制心形的端到端示例。闲话少说(比如谈论 Flutter 的历史或它有多华丽),让我们深入研究代码并制作一些东西。 ”

例子

预览

我们将创建 4 个心形。第一个没有边界,但其他的有。

img

步骤

1.通过扩展CustomPainter类来实现一个画笔:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class MyPainter extends CustomPainter {
  // The color of the heart
  final Color bodyColor;

  // The color of the border of the heart
  final Color borderColor;
  // The thickness of the border
  final double borderWith;

  MyPainter(this.bodyColor, this.borderColor, this.borderWith);

  @override
  void paint(Canvas canvas, Size size) {
    // The body of the heart
    final Paint body = Paint();
    body
      ..color = bodyColor
      ..style = PaintingStyle.fill
      ..strokeWidth = 0;

    // The border of the heart
    final Paint border = Paint();
    border
      ..color = borderColor
      ..style = PaintingStyle.stroke
      ..strokeCap = StrokeCap.round
      ..strokeWidth = borderWith;

    final double width = size.width;
    final double height = size.height;

    final Path path = Path();
    path.moveTo(0.5 * width, height * 0.4);
    path.cubicTo(0.2 * width, height * 0.1, -0.25 * width, height * 0.6,
        0.5 * width, height);
    path.moveTo(0.5 * width, height * 0.4);
    path.cubicTo(0.8 * width, height * 0.1, 1.25 * width, height * 0.6,
        0.5 * width, height);

    canvas.drawPath(path, body);
    canvas.drawPath(path, border);
  }

2.使用 CustomPaint 小部件和我们之前创建的画家绘制心形:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// Non-border heart
          CustomPaint(
            size: const Size(280, 260),
            painter: MyPainter(Colors.pink, Colors.transparent, 0),
          ),

// Hearts with borders
          CustomPaint(
            size: const Size(200, 120),
            painter: MyPainter(Colors.purple, Colors.black, 10),
          ),
          CustomPaint(
            size: const Size(200, 240),
            painter: MyPainter(Colors.red, Colors.redAccent, 5),
          ),
          CustomPaint(
            size: const Size(50, 100),
            painter: MyPainter(Colors.amber, Colors.indigo, 10),
          ),

最终代码

这是main.dart中的完整代码,它生成了上面屏幕截图中显示的很酷的心形:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// main.dart
import 'package:flutter/material.dart';

void main() {
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      // Hide the debug banner
      debugShowCheckedModeBanner: false,
      title: 'breeze',
      theme: ThemeData(
        primarySwatch: Colors.indigo,
      ),
      home: const HomeScreen(),
    );
  }
}

// Implementing our heart painter
class MyPainter extends CustomPainter {
  // The color of the heart
  final Color bodyColor;

  // The color of the border of the heart
  final Color borderColor;
  // The thickness of the border
  final double borderWith;

  MyPainter(this.bodyColor, this.borderColor, this.borderWith);

  @override
  void paint(Canvas canvas, Size size) {
    // The body of the heart
    final Paint body = Paint();
    body
      ..color = bodyColor
      ..style = PaintingStyle.fill
      ..strokeWidth = 0;

    // The border of the heart
    final Paint border = Paint();
    border
      ..color = borderColor
      ..style = PaintingStyle.stroke
      ..strokeCap = StrokeCap.round
      ..strokeWidth = borderWith;

    final double width = size.width;
    final double height = size.height;

    final Path path = Path();
    path.moveTo(0.5 * width, height * 0.4);
    path.cubicTo(0.2 * width, height * 0.1, -0.25 * width, height * 0.6,
        0.5 * width, height);
    path.moveTo(0.5 * width, height * 0.4);
    path.cubicTo(0.8 * width, height * 0.1, 1.25 * width, height * 0.6,
        0.5 * width, height);

    canvas.drawPath(path, body);
    canvas.drawPath(path, border);
  }

  @override
  bool shouldRepaint(CustomPainter oldDelegate) {
    return true;
  }
}

class HomeScreen extends StatefulWidget {
  const HomeScreen({Key? key}) : super(key: key);

  @override
  State<HomeScreen> createState() => _HomeScreenState();
}

class _HomeScreenState extends State<HomeScreen> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('KindaCode.com'),
      ),
      body: Center(
          child: Column(
        mainAxisAlignment: MainAxisAlignment.spaceAround,
        mainAxisSize: MainAxisSize.min,
        children: [
          // Non-border heart
          CustomPaint(
            size: const Size(280, 260),
            painter: MyPainter(Colors.pink, Colors.transparent, 0),
          ),

          // Hearts with borders
          CustomPaint(
            size: const Size(200, 120),
            painter: MyPainter(Colors.purple, Colors.black, 10),
          ),
          CustomPaint(
            size: const Size(200, 240),
            painter: MyPainter(Colors.red, Colors.redAccent, 5),
          ),
          CustomPaint(
            size: const Size(50, 100),
            painter: MyPainter(Colors.amber, Colors.indigo, 10),
          ),
        ],
      )),
    );
  }
}

参考

您可以在官方文档中找到有关 CustomPaint 小部件和 CustomPainter 类的更多详细信息:

后记

您已经学会了如何在不使用任何第三方软件包的情况下从头开始绘制自定义心形。此时,您应该对 Flutter 中的绘图有了更好的了解。

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

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

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

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
深入探索 Flutter 鸿蒙版的画笔使用与高级自定义动画
在 Flutter 中,绘图是一项强大的功能,可以帮助开发者创建自定义界面和独特的视觉效果。通过 CustomPainter 和 Canvas,我们可以实现复杂的图形和动画。本文将深入探讨 Flutter 中的画笔使用,包括如何编写高级自定义动画。
淼学派对
2024/11/04
510
【Flutter高级玩法】 贝塞尔曲线的表象认知
由于点位需要变化,BezierPainter只承担绘制的责任,这里在组件中定义点位信息_pos和选中索引_selectIndex ,通过构造函数传入BezierPainter。为了方便大家玩耍,我单独写个文件play_bezier2.dart里面有个PlayBezier2Page组件。
张风捷特烈
2020/04/30
1.7K0
【Flutter高级玩法】 贝塞尔曲线的表象认知
Flutter 动画鼻祖之CustomPaint
老孟导读:CustomPaint可以称之为动画鼻祖,它可以实现任何酷炫的动画和效果。CustomPaint本身没有动画属性,仅仅是绘制属性,一般情况下,CustomPaint会和动画控制配合使用,达到理想的效果。
老孟Flutter
2020/09/11
5910
【Flutter绘制集录】第二画: 流光
本文来通过一个小案例,介绍一下 Flutter 绘制 和 Flutter 动画 的使用。如下,是一个七彩的圆环,其中有两个动画效果:
张风捷特烈
2022/03/08
1.3K0
【Flutter绘制集录】第二画: 流光
flutter自定义组件
如何用canvas绘制我们任何想要任意图案的组件,这篇文章用自定义一个五角星组件来说明
韦东锏
2022/04/11
5510
flutter自定义组件
【我的 Flutter 开源库 】 - 虚线绘制库 dash_painter
有很多人问我如何绘制虚线,一直没有这方面需求,没有太在意。现在想一下,通过路径测量实现虚线绘制应该是非常简单的。就抽了点空,顺手写个好用的虚线路径绘制工具,不然平时画个辅助线啥的确实挺费劲。
张风捷特烈
2022/03/08
2K0
【我的 Flutter 开源库 】 -  虚线绘制库 dash_painter
[-Flutter 自组篇-] 圆形进度条
今天写个简单的,自定义一个圆形进度条,并且加上小箭头指向内圈进度。 进度条已上传到公网,使用circle_progress: ^0.0.1,使用如下 void main() => runApp(Ma
张风捷特烈
2020/04/30
1.8K0
[-Flutter 自组篇-] 圆形进度条
【 Flutter 绘制 】点集的贝塞尔曲线拟合
本文作为对掘金小册 《Flutter 绘制指南 - 妙笔生花》 的一个知识补充点,后面会更新到小册中。在此也希望记录和分享一下 Flutter 中如何通过贝塞尔曲线使折线形成曲线。源码在这。 1.
张风捷特烈
2020/12/14
2K0
【 Flutter 绘制 】点集的贝塞尔曲线拟合
Flutter使用Canvas实现精美表盘效果
上个月参加掘金创作者训练营时,发现训练营中的一位兄弟通过 css3 实现了一个精美的表盘,效果看着确实不错很漂亮,跟 UI 做的设计图差不多了, 当时就在想能不能在 Flutter 中实现一个同样的效果,于是趁着周末空闲时间使用 Flutter 的 Canvas 使用了一个同样的效果。
loongwind
2022/09/27
1.4K1
Flutter使用Canvas实现精美表盘效果
【flutter高级玩法】贝塞尔实战1 - 波浪
一切视觉的动效都只是感性的欺骗,如我手中的线,跳动的人偶。她征服着你,我控制着她。--捷特
张风捷特烈
2020/04/30
1.2K0
【flutter高级玩法】贝塞尔实战1 - 波浪
flutter 路径的用法
本节目标: [1]. 了解如何通过移动路径形成形状:直线移动、圆弧移动、圆锥曲线移动、贝塞尔曲线移动。 [2]. 了解路径的 [绝对移动] 和 [相对移动]。 [3]. 了解在已有的路径中添加其他形状:添加矩形、圆角矩形、椭圆、圆弧、多边形、其他路径。 [4]. 使用 path 绘制坐标系。 ---- 一、路径加入方法 下图是路径形成的基础方法,包括路径的移动、加入直线、圆弧、圆锥曲线、贝塞尔曲线。 对这些 API 的掌握程度,直接决定你运用路径的能力。 ---- 1.moveTo和lineTo:
用户1974410
2022/09/20
9150
flutter 路径的用法
[-Flutter 自组篇-] 蛛网图+绘制+动画实践
在Android的时候自定义过蛛网图,花了半天时间。复刻到Flutter只用了不到20分钟 不得不说Flutter中的Canvas对安卓玩家还是非常友好的,越来越觉得Flutter非常有趣。 在视
张风捷特烈
2020/04/30
1.4K0
[-Flutter 自组篇-] 蛛网图+绘制+动画实践
Flutter 漏斗加载动画效果
下面我们看看漏斗加载动画效果是如何实现的?动画效果实现的思路是绘制一个静止的效果,其中可变的效果使用参数控制,回到我们的漏斗加载动画,先绘制一个中间状态,效果如下:
老孟Flutter
2021/09/03
1.9K0
Flutter 漏斗加载动画效果
flutter画笔paint的认识
两条线段连接处的形状。⚠️:strokeJoin在Canvas.drawPoints 画点时不起作用。
用户1974410
2022/09/20
1.5K0
flutter画笔paint的认识
Flutter 动画之 Animation
1.前言 1.1:Flutter动画中: 首先要看的是Flutter中动画的几个类之间的关系: 主角当然是我们的Animation类了,它可以借助Animatable进行强化 Animata
张风捷特烈
2020/04/30
2.1K0
Flutter 动画之 Animation
【Flutter 专题】138 图解自定义国旗渐变头像
国庆节马上就要到了,为了庆祝伟大祖国的生日,现在朋友圈的各位大佬们也都更新了社交的头像,渐变色的红旗相当有格调,今天和尚通过 Flutter 方式自定义一个简单的渐变国旗头像;
阿策小和尚
2021/10/12
7860
Flutter使用Canvas实现微信红包领取效果
前面写了一篇 Flutter 使用 Canvas 实现精美表盘效果[1] 的文章,对 Flutter 中的 Canvas 使用有了进一步的理解,就想着再用 Canvas 实现一个什么样的效果来加深一下对 Canvas 使用的理解,这个时候正好看到群里有人发红包,于是就想着能不能在 Flutter 中使用 Canvas 实现微信领取红包的效果?想到就做,知行合一,经过几天空余时间的研究,最终实现了微信领取红包效果,于是有了这篇文章。
loongwind
2022/09/27
1.7K0
Flutter使用Canvas实现微信红包领取效果
flutter路径的用法(下)
本节目标: [1]. 了解路径的 [封闭] [重置] [偏移] 操作。 [2]. 了解路径的 [矩形边距] 和 [检测点是否在路径中]。 [3]. 了解路径的 [路径变换] 和 [路径联合]。 [4]. 了解路径测量的用法和作用。 ---- 一、路径操作 路径的操作是路径使用的重要一环,很多路径的特效和复杂路径的拼合都会使用它们。 ---- 1.close、reset、shift path#close :用于将路径尾点和起点,进行路径封闭。 path#reset :用于将路径进行重置,清除路径内容。
用户1974410
2022/09/20
9810
flutter路径的用法(下)
flutter绘制的基础
我们去绘画的时候我们会想在哪画,画什么,怎么画。相对于画家这种创造性的职业,画什么是他们最难的。到我们我们程序员这里就不必考虑的太多。在哪画都是固定的,画什么需求都定好了,怎么画这才是考验我们程序员的。
用户1974410
2022/09/20
9540
flutter绘制的基础
【Flutter 专题】83 图解自定义 ACEWave 波浪 Widget (一)
和尚今天尝试一下绘制波浪的效果,虽然 pub 仓库中已经有成熟的插件,但和尚还是准备用之前学习的 Canvas 和 Animation 尝试自定义一个 ACEWave;
阿策小和尚
2020/04/27
9620
相关推荐
深入探索 Flutter 鸿蒙版的画笔使用与高级自定义动画
更多 >
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验