聊一聊Flutter自定义组件

2023-07-06  本文已影响0人  BlueSocks

自定义组件介绍

自定义组件类型

自绘组件

CustomPaint类

    CustomPaint({
      Key key,
      this.painter, 
      this.foregroundPainter,
      this.size = Size.zero, 
      this.isComplex = false, 
      this.willChange = false, 
      Widget child, //子节点,可以为空
    })
    

示例:五子棋盘

    import 'package:flutter/material.dart';
    import 'dart:math';
    
    class CustomPaintRoute extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return Center(
          child: CustomPaint(
            size: Size(300, 300), //指定画布大小
            painter: MyPainter(),
          ),
        );
      }
    }
    
    class MyPainter extends CustomPainter {
      @override
      void paint(Canvas canvas, Size size) {
        double eWidth = size.width / 15;
        double eHeight = size.height / 15;
          
        //画棋盘背景
        var paint = Paint()
          ..isAntiAlias = true
          ..style = PaintingStyle.fill //填充
          ..color = Color(0x77cdb175); //背景为纸黄色
        canvas.drawRect(Offset.zero & size, paint);
    
        //画棋盘网格
        paint
          ..style = PaintingStyle.stroke //线
          ..color = Colors.black87
          ..strokeWidth = 1.0;
    
        for (int i = 0; i <= 15; ++i) {
          double dy = eHeight * i;
          canvas.drawLine(Offset(0, dy), Offset(size.width, dy), paint);
        }
    
        for (int i = 0; i <= 15; ++i) {
          double dx = eWidth * i;
          canvas.drawLine(Offset(dx, 0), Offset(dx, size.height), paint);
        }
    
        //画一个黑子
        paint
          ..style = PaintingStyle.fill
          ..color = Colors.black;
        canvas.drawCircle(
          Offset(size.width / 2 - eWidth / 2, size.height / 2 - eHeight / 2),
          min(eWidth / 2, eHeight / 2) - 2,
          paint,
        );
          
        //画一个白子
        paint.color = Colors.white;
        canvas.drawCircle(
          Offset(size.width / 2 + eWidth / 2, size.height / 2 - eHeight / 2),
          min(eWidth / 2, eHeight / 2) - 2,
          paint,
        );
      }
    
      //在实际场景中正确利用此回调可以避免重绘开销,本示例我们简单的返回true
      @override
      bool shouldRepaint(CustomPainter oldDelegate) => true;
    }
    

绘制性能问题

上一篇 下一篇

猜你喜欢

热点阅读