Flutter CustomPaint绘制widget使用示例

 更新时间:2022年12月12日 11:38:55   作者:IAM17  
这篇文章主要为大家介绍了Flutter CustomPaint绘制widget使用示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

CustomPaint 介绍

Flutter CustomPaint 提供了一个 canvas,可以在绘制阶段在上面进行绘制内容。

需要绘制时,CustomPaint 首先要求它的 painter 在当前画布上绘画,然后它绘画它的 child,在绘画完它的 child 之后,要求他的 foregroundPainter 绘画。

需要在从原点开始并包含给定大小的区域的矩形内作画。 (如果在这些边界之外绘画,则分配的内存可能不足以光栅化绘画命令,并且结果行为未定义。)要保证在这些边界内绘画,请考虑使用 ClipRect。

使用 CustomPaint

const CustomPaint({
    super.key,
    this.painter,
    this.foregroundPainter,
    this.size = Size.zero,
    this.isComplex = false,
    this.willChange = false,
    super.child,
  }) 

最重要就是这个 painter,painter 需要自定义。

class MyPainter extends CustomPainter {
  @override
  void paint(Canvas canvas, Size size) {
    var paint = Paint()
      ..color = Colors.red
      ..style = PaintingStyle.stroke
      ..strokeWidth = 1.0;
    canvas.drawLine(
        Offset(0, 10),
        Offset(
          100,
          10,
        ),
        paint);
  }
  @override
  bool shouldRepaint(covariant CustomPainter oldDelegate) {
    return false;
  }
}

需要重写两个方法,在 paint 方法中进行绘制。如果绘制不受外界影响,shouldRepaint 返回 false 就好。

CustomPaint(painter: MyPainter(),);

把 MyPainter 赋值给参数 painter 就好了。

size 的大小。

如果 CustomPaint 的约束可以为 0 的话,那么 size 的值 Size(0,0),就是说,size 的值总是 Constrains 的最小 width,最小 height。有两种办法可以改变 size。

  • 可以给 CustomPaint 加上约束,比如加一个 SizedBox
 SizedBox(
        height: 20,
        width: 20,
        child: CustomPaint(
          painter: MyPainter(),
      ))
  • 可以直接指定 size 参数。
 SizedBox(
        height: 20,
        width: 20,
        child: CustomPaint(
          size:Size(30,30),
          painter: MyPainter(),
      ))

size 参数可以在 constrains 的范围内起到作用。在本例中,约束为 20, size 为 30,最后传给 paint 方法的 size 为 20。 tight 约束下 size 参数无效,只有 在loose 约束下 ,size 参数才能起到作用。

isComplex

是否提示应该缓存该层的绘画。如果 为false,则合成器将自己来决定这一层是否应该缓存。

willChange

是否应该告知缓存层这幅画在下一帧中可能会发生变化。如果 isComplex 为 true,才需要考虑这个参数。

foregroundPainter

默认绘制的层是在 child 之下,foregroundPainter 在 child 之上。

动画

CustomPainter 有一个 可选的参数 Listenable? repaint ,是用来做动画的。

举个例子。

class MyPainter extends CustomPainter {
  MyPainter(Animation<double> animation) :_animation=animation, super(repaint: animation);
  final Animation<double> _animation;
  @override
  void paint(Canvas canvas, Size size) {
    var paint = Paint()
      ..color = Colors.red
      ..style = PaintingStyle.stroke
      ..strokeWidth = 1.0;
    canvas.drawLine(
        Offset(0, 10),
        Offset(
          100*_animation.value,
          10,
        ),
        paint);
  }
  @override
  bool shouldRepaint(covariant CustomPainter oldDelegate) {
    return false;
  }
}
class MyStatefulWidget extends StatefulWidget {
  const MyStatefulWidget({super.key});
  @override
  State<MyStatefulWidget> createState() => _MyStatefulWidgetState();
}
class _MyStatefulWidgetState extends State<MyStatefulWidget> with SingleTickerProviderStateMixin{
 late AnimationController controller= 
      AnimationController(duration: Duration(seconds: 2),vsync: this)..repeat();
  @override
  Widget build(BuildContext context) {
    return SizedBox(
        height: 20,
        width: 20,
        child: CustomPaint(
          painter: MyPainter(controller.view),
        ));
  }
}

会看到一条红色的直线由短变长。

以上就是Flutter CustomPaint绘制widget使用示例的详细内容,更多关于Flutter CustomPaint绘制widget的资料请关注脚本之家其它相关文章!

相关文章

  • iOS 中Swift仿微信添加提示小红点功能(无数字)

    iOS 中Swift仿微信添加提示小红点功能(无数字)

    这篇文章主要介绍了iOS 中Swift仿微信添加提示小红点功能(无数字),非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2017-05-05
  • iOS自定义日期选择器

    iOS自定义日期选择器

    这篇文章主要为大家详细介绍了iOS自定义日期选择器,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-02-02
  • 详解iOS App中调用AVAudioPlayer播放音频文件的用法

    详解iOS App中调用AVAudioPlayer播放音频文件的用法

    这篇文章主要介绍了iOS App中调用AVAudioPlayer播放音频文件的用法,AVAudioPlayer仅能播放本地文件而不能添加网络源,实例代码为Objective-C,需要的朋友可以参考下
    2016-03-03
  • iOS监控笔记之启动crash

    iOS监控笔记之启动crash

    iOS崩溃是让iOS开发人员比较头痛的事情,app崩溃了,说明代码写的有问题,下面这篇文章主要给大家介绍了关于iOS监控笔记之启动crash的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2018-05-05
  • 手把手教你实现微信小视频iOS代码实现

    手把手教你实现微信小视频iOS代码实现

    这篇文章主要手把手教你实现微信小视频,iOS代码实现微信小视频功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-08-08
  • ios10以下safari设置style无效的解决方法

    ios10以下safari设置style无效的解决方法

    这篇文章主要介绍了ios10以下safari设置style无效的解决方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-09-09
  • iOS开发之适配iOS10以及Xcode8

    iOS开发之适配iOS10以及Xcode8

    这篇文章主要为大家详细介绍了iOS开发之适配iOS10以及Xcode8的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-09-09
  • IOS设置QQ小红点消除的方法(一键退朝)

    IOS设置QQ小红点消除的方法(一键退朝)

    这篇文章主要介绍了IOS设置QQ小红点消除的方法(一键退朝),对ios设置小红点消除相关知识感兴趣的朋友一起学习吧
    2016-01-01
  • iOS实现播放远程网络音乐的核心技术点总结

    iOS实现播放远程网络音乐的核心技术点总结

    本篇文章主要介绍了iOS播放远程网络音乐的核心技术,采用ios系统自带的AVFoundation框架来实现,有需要的朋友可以了解一下。
    2016-11-11
  • iOS中的地理位置的获取及plist设置方法

    iOS中的地理位置的获取及plist设置方法

    下面小编就为大家分享一篇iOS中的地理位置的获取及plist设置方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-02-02

最新评论