当前位置: 代码网 > it编程>App开发>苹果IOS > Flutter CustomPaint绘制widget使用示例

Flutter CustomPaint绘制widget使用示例

2024年05月18日 • 苹果IOS •我要评论
custompaint 介绍flutter custompaint 提供了一个 canvas,可以在绘制阶段在上面进行绘制内容。需要绘制时,custompaint 首先要求它的 painter 在当前

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的资料请关注代码网其它相关文章!

赞 (0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2026  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com