Flutter绘图组件之CustomPaint使用详解

 更新时间:2022年03月14日 12:01:22   作者:岛上码农  
CustomPaint是Flutter中用于自由绘制的一个widget,它与android原生的绘制规则基本一致,以当前Canves(画布)的左上角为原点进行绘制。本文将详细讲解CustomPaint的使用教程,需要的可以参考一下

简介

在有些场景中,我们会需要绘制一些高度定制化的组件,比如 UI 设计师给我们出了个难题 —— 弄一个奇形怪状的边框。看在 UI 设计师是一个漂亮小姐姐的份上,又不好意思说这个做不了(那样也很没面子)。这个时候我们就不能直接使用 Flutter 自带的那些组件了,而是需要手动绘制组件,那就会需要用到 CuntomPaint 组件。CustomPaint 组件和前端的 Canvas差不多,允许我们在一个画布上绘制各种元素,包括点、线、矩形、圆弧、文字、图片等等。

CustomPaint 介绍

CustomPaint是一个 Widget,其中有三个重要的参数:

CustomPaint(
  child: childWidget(),
  foregroundPainter: foregroundPainter(),
  painter: backgroundPainter(),
)

childCustomPaint的子组件;

painterforegroundPainter:都是 CustomPainter 类,用于定义 canvas 绘制的内容。区别在于,首先是执行 painter 的绘制指令。然后是在背景上渲染 child 子组件。最后,foregroundPainter 的内容会绘制在 child 上一层。

CustomPainter提供了一个paint绘图方法供我们绘制图形,该方法携带canvassize两个参数,其中 canvas 是画布,size 是画布大小。canvas 提供了很多绘制图形的方法,比如绘制路径、矩形、圆形和线条等等。

CustomPainter 示例

有了上面的基础概念后,我们来一个简单的示例来演示三个参数的层级关系。我们在backgroundPainter 上绘制一个蓝色的正方形,然后传入一个原型图片组件作为 child,最后是在 foregroundPainter 上绘制一个半透明的红色圆形遮住一部分图片。最终实现效果如下图,这样我们可以很好地了解三个元素的关系。

完整代码如下:

import 'dart:ui';
import 'package:flutter/material.dart';

class BasicPaintPage extends StatelessWidget {
  const BasicPaintPage({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return CustomPaint(
      child: Center(
        child: ClipOval(
          child: Image.asset(
            'images/beauty.jpeg',
            width: 200,
            height: 200,
            fit: BoxFit.fitWidth,
          ),
        ),
      ),
      painter: BackgroundPainter(),
      foregroundPainter: ForegroundPainter(),
    );
  }
}

class BackgroundPainter extends CustomPainter {
  @override
  void paint(Canvas canvas, Size size) {
    canvas.drawColor(Color(0xFFF1F1F1), BlendMode.color);
    var center = size / 2;
    var paint = Paint()..color = Color(0xFF2080E5);
    paint.strokeWidth = 2.0;

    canvas.drawRect(
      Rect.fromLTWH(center.width - 120, center.height - 120, 240, 240),
      paint,
    );
  }

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

class ForegroundPainter extends CustomPainter {
  @override
  void paint(Canvas canvas, Size size) {
    var center = size / 2;
    var paint = Paint()..color = Color(0x80F53010);
    paint.strokeWidth = 2.0;

    canvas.drawCircle(
      Offset(center.width, center.height),
      100,
      paint,
    );
  }

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

其中在背景绘制中我们制定了canvas 的背景色,即下面这行代码:

canvas.drawColor(Color(0xFFF1F1F1), BlendMode.color);

其他代码就相对好理解了,BackgroundPainter 绘制了一个蓝色正方形,child 是一个居中的圆形图片,而 ForegroundPainter 则是在中间绘制了一个和圆形图片同等大小的,半透明的红色圆圈。于是就得到了我们想要的效果。

总结

本篇介绍了 CustomPaint 的基本使用,可以看到 CustomPaint使用起来并不复杂,但是真正复杂的是如何绘制图形,这个需要有比较好的数学知识支撑(当然,如果确实不会也可以搜索相关资料)。接下来的一篇我们来绘制一些常见的图形。

到此这篇关于Flutter绘图组件之CustomPaint使用详解的文章就介绍到这了,更多相关Flutter CustomPaint内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Android实现倒计时结束后跳转页面功能

    Android实现倒计时结束后跳转页面功能

    最近在工作中遇到一个需求,需要在倒计时一段时间后进行跳转页面,通过查找相关资料发现其中涉及的知识还不少,所以分享出来,下面这篇文章主要给大家介绍了关于Android实现倒计时结束后跳转页面功能的相关资料,需要的朋友可以参考下。
    2017-11-11
  • Android内存泄漏的轻松解决方法

    Android内存泄漏的轻松解决方法

    这篇文章主要给大家介绍了关于Android内存泄漏的轻松解决方法,文中通过示例代码介绍的非常详细,对各位Android具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-04-04
  • Android转场动画深入分析探究

    Android转场动画深入分析探究

    对于一个动画而言,它是由多个分镜头组成的,而转场就是分镜之间衔接方式。转场的主要目的,就是为了让镜头与镜头之间过渡的更加自然,让动画更加连贯,例如两个页面切换之间的衔接动画
    2022-10-10
  • Kotlin浅析延迟初始化与密封类的实现方法

    Kotlin浅析延迟初始化与密封类的实现方法

    Kotlin语言的许多特性,包括变量不可变,变量不可为空,等等。这些特性都是为了尽可能地保证程序安全而设计的,但是有些时候这些特性也会在编码时给我们带来不少的麻烦,下面我们来了解延迟初始化和密封类的特点
    2022-08-08
  • Android中Volley框架下保持会话方法

    Android中Volley框架下保持会话方法

    这个是基于session的一个网络会话,手机app给服务器发送登陆请求的时候,服务器返回的网络response(networkRespone)的头(head)里面存放着你想要的sessionid。这篇文章主要介绍了Android中Volley框架下保持会话方法的相关资料,需要的朋友可以参考下
    2016-11-11
  • Android实现app应用多语言切换功能

    Android实现app应用多语言切换功能

    这篇文章主要为大家详细介绍了Android实现app应用多语言切换功能的相关资料,类似于微信的语言切换,感兴趣的小伙伴们可以参考一下
    2016-08-08
  • Android实现轻量线性与百分比图表的方法

    Android实现轻量线性与百分比图表的方法

    这篇文章主要给大家介绍了关于Android实现轻量线性与百分比图表的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习学习吧。
    2017-12-12
  • Android 自定义View实现计时文字详解

    Android 自定义View实现计时文字详解

    这篇文章主要为大家介绍了Android 自定义View实现计时文字详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-04-04
  • Android 绘制多级树形选择列表实例代码

    Android 绘制多级树形选择列表实例代码

    这篇文章主要介绍了Android 绘制多级树形选择列表的相关知识,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2018-02-02
  • Android中网络框架简单封装的实例方法

    Android中网络框架简单封装的实例方法

    在本篇文章里小编给大家整理的是关于Android中网络框架简单封装的实例方法,需要的朋友们可以学习下。
    2020-03-03

最新评论