Flutter--画笔 CustomPainter

本文展示了如何在Flutter中使用CustomPaint和CustomPainter组件进行自定义图形绘制,包括绘制直线、比例尺、圆环和路径。通过这些示例,开发者可以学习到如何创建个性化画布和交互式UI元素。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.创建画板 CustomPaint

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: SizedBox(
          width: 400,
          height: 400,
          child: CustomPaint(painter: TestPaint(),),
        ),
      ),
    );
  }

2.创建绘画工具 CustomPainter

class TestPaint extends CustomPainter {

  @override
  void paint(Canvas canvas, Size size) {
    canvas.drawLine(Offset(size.width / 2, size.height / 2 - (size.height * 0.3)), Offset(size.width / 2, 0), circlePaint);
  }

  @override
  bool shouldRepaint(covariant TestPaint oldDelegate) {
    //和刷新有关
    return true;
  }
}

3.一些常用样式绘制示例

canvas.drawLine(Offset(size.width / 2, size.height / 2 - size.height), Offset(size.width / 2, 0), Paint());

 

void drawScale(Canvas canvas, Size size) {
    final Paint circlePaint = Paint()
      ..style = PaintingStyle.stroke
      ..strokeWidth = 2.5;

    double angleRange = 180;

    double progress = 0.5;

    double rootAngle = (360 - angleRange) / 2 + 90;

    final radius = min(size.width, size.height) / 2 - circlePaint.strokeWidth / 2;

    circlePaint.color = Colors.black26;
    Offset center = Offset(size.width / 2, size.height / 2);
    for (int i = 0; i <= angleRange; i++) {
      if (i % 6 == 0) {
        Offset start = degreesToCoordinates(center, i + rootAngle, radius - 10);
        Offset end = degreesToCoordinates(center, i + rootAngle, radius);
        canvas.drawLine(start, end, circlePaint);
      }
    }
    circlePaint.color = Colors.red;

    Offset start = degreesToCoordinates(center, angleRange * progress + rootAngle, radius - 15);
    Offset handler = degreesToCoordinates(center, angleRange * progress + rootAngle, radius);
    canvas.drawLine(start, handler, circlePaint);
  }

  Offset degreesToCoordinates(Offset center, double degrees, double radius) {
    return radiansToCoordinates(center, degreeToRadians(degrees), radius);
  }

  double degreeToRadians(double degree) {
    return (pi / 180) * degree;
  }

  Offset radiansToCoordinates(Offset center, double radians, double radius) {
    var dx = center.dx + radius * cos(radians);
    var dy = center.dy + radius * sin(radians);
    return Offset(dx, dy);
  }

 

  void drawCircle(Canvas canvas, Size size) {
    final Paint circlePaint = Paint()
      ..style = PaintingStyle.stroke
      ..strokeWidth = 40
      ..strokeCap = StrokeCap.round;

    double angleRange = 300;
    List<Color> colors = [Colors.red, Colors.orange, Colors.yellow, Colors.green, Colors.cyan, Colors.blue, Colors.purple];

    double a = pi / 180;
    double rootAngle = (360 - angleRange) / 2 + 90;

    double start = a * rootAngle;
    double end = a * angleRange;

    double redress = 15;

    final radius = min(size.width, size.height) / 2 - circlePaint.strokeWidth / 2;
    final rect = Rect.fromCircle(radius: radius, center: Offset(size.width / 2, size.height / 2));

    circlePaint.shader = SweepGradient(
        transform: GradientRotation(a * (rootAngle - redress)),
        tileMode: TileMode.mirror,
        colors: colors,
        startAngle: 0,
        endAngle: end + a * redress
    ).createShader(rect);
    canvas.drawArc(rect, start, end, false, circlePaint);
  }

 

canvas.drawDRRect(RRect.fromLTRBR(0, 0, 100, 100, const Radius.circular(10)), RRect.fromLTRBR(10, 10, 90, 90, const Radius.circular(45)), Paint());

Path path = Path();
    path.moveTo(200, 0);
    path.lineTo(100, 100);
    path.lineTo(200, 100);
    path.lineTo(100, 200);
    canvas.drawPath(path, Paint()..style = PaintingStyle.stroke);

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值