Flutter

Flutter-自定义一个简单的虚线控件

2021-04-15  本文已影响0人  Cosecant

虚线是在开发中经常需要的,但是系统又没有提供相应的组件,那只好我们自己绘制一个了,代码实现很简单,请看下面内容:

import 'package:flutter/material.dart';

/// 虚线组件
class DashLine extends StatelessWidget {
  static const int DIRECTION_LINEAR = 0;

  static const int DIRECTION_VERTICAL = 1;

  DashLine({
    required this.size,
    this.direction = DIRECTION_LINEAR,
    this.dashLineSize = 5,
    this.spacingSize = 3,
    this.color = Colors.grey,
    this.radius = Radius.zero,
  });

  final Size size;

  final int direction;

  final double dashLineSize;

  final double spacingSize;

  final Color color;

  final Radius radius;

  @override
  Widget build(BuildContext context) => ClipRect(
      child: CustomPaint(
          size: size,
          painter: _DashLinePainter(
              direction: direction,
              dashLineSize: dashLineSize,
              spacingSize: spacingSize,
              color: color,
              radius: radius)));
}

class _DashLinePainter extends CustomPainter {
  _DashLinePainter({
    this.direction = DashLine.DIRECTION_LINEAR,
    this.dashLineSize = 10,
    this.spacingSize = 3,
    this.color = Colors.grey,
    this.radius = Radius.zero,
  });

  Paint _paint = Paint();

  final int direction;

  final double dashLineSize;

  final double spacingSize;

  final Color color;

  final Radius radius;

  @override
  void paint(Canvas canvas, Size size) {
    _paint
      ..isAntiAlias = true
      ..color = color;
    int lineCount = 0;
    double blockSize = dashLineSize + spacingSize;
    if (direction == DashLine.DIRECTION_VERTICAL) {
      int intCount = size.height ~/ blockSize;
      lineCount = intCount + (size.height - intCount > 0 ? 1 : 0);
      for (var i = 0; i < lineCount; i++) {
        double top = i * blockSize;
        double bottom = i * blockSize + dashLineSize;
        canvas.drawRRect(
            RRect.fromLTRBR(0, top, size.width, bottom, radius), _paint);
      }
    } else {
      int intCount = size.width ~/ (dashLineSize + spacingSize);
      lineCount = intCount + ((size.width - intCount > 0) ? 1 : 0);
      for (var i = 0; i < lineCount; i++) {
        double left = i * blockSize;
        double right = i * blockSize + dashLineSize;
        canvas.drawRRect(
            RRect.fromLTRBR(left, 0, right, size.height, radius), _paint);
      }
    }
  }

  @override
  bool shouldRepaint(covariant CustomPainter oldDelegate) {
    var old = oldDelegate as _DashLinePainter;
    return old.color != color ||
        old.radius != radius ||
        old.direction != direction ||
        old.dashLineSize != dashLineSize ||
        old.spacingSize != spacingSize;
  }
}

使用Sample:

DashLine(
                  size: Size(0.5, 40),
                  color: AppColorPalette.primaryLightColor,
                  dashLineSize: 3,
                  spacingSize: 3,
                  direction: DashLine.DIRECTION_VERTICAL)

sample2:

Row(crossAxisAlignment: CrossAxisAlignment.center, children: [
              Expanded(child: DashLine(size: Size.fromHeight(0.5))),
              Padding(
                  padding: EdgeInsets.symmetric(horizontal: 8),
                  child: Text('2019',
                      style: TextStyle(
                          fontSize: 12,
                          color: AppColorPalette.primaryColor))),
              Expanded(child: DashLine(size: Size.fromHeight(0.5))),
            ])
上一篇下一篇

猜你喜欢

热点阅读