绘制虚线圆角矩形的Flutter小部件

news/2024/7/20 20:37:26 标签: flutter, android, ios

在Flutter中,我们经常需要自定义各种视觉效果的小部件以满足特定的设计需求。有时候,我们可能需要绘制虚线的形状,比如虚线圆角矩形。在本文中,我将介绍如何创建一个名为DashedRectBoxWidget的小部件,它可以绘制带有虚线边框的圆角矩形。

首先,让我们看一下DashedRectBoxWidget的代码:

import 'package:flutter/material.dart';

class DashedRectBoxWidget extends StatelessWidget {
  final Widget child;

  const DashedRectBoxWidget({
    Key? key,
    required this.child,
  }) : super(key: key);

  
  Widget build(BuildContext context) {
    return CustomPaint(
      painter: DashedRectPainter(),
      child: child,
    );
  }
}

DashedRectBoxWidget是一个无状态的小部件,它接受一个名为child的参数,并在其周围绘制虚线边框。现在,让我们看一下实际绘制虚线边框的代码。

import 'package:flutter/material.dart';

/// 虚线圆角矩形绘制
class DashedRectPainter extends CustomPainter {
  /// 虚线的段长
  final double span;

  /// 虚线段之间的空隙长度
  final double step;

  /// 虚线段中增加的点数
  final int pointCount;

  /// 点的宽度(可选)
  final double? pointWidth;

  /// 圆角的半径
  final double borderRadius;

  DashedRectPainter({
    this.span = 9,
    this.step = 9,
    this.pointCount = 0,
    this.pointWidth,
    this.borderRadius = 26,
  });

  
  void paint(Canvas canvas, Size size) {
    // 创建画笔
    Paint paint = Paint()
      ..style = PaintingStyle.stroke
      ..color = Color(0xFFDBDCE0)
      ..strokeWidth = 2;
    // 获取矩形宽高
    final double rectWidth = size.width;
    final double rectHeight = size.height;
    // 创建路径并添加圆角
    Path path = Path();
    path.addRRect(
      RRect.fromRectAndRadius(
        Rect.fromLTWH(0, 0, rectWidth, rectHeight),
        Radius.circular(borderRadius),
      ),
    );
    // 点的默认线长
    const double pointLineLength = 2;
    // 计算每段虚线的总长度
    final double partLength = step +
        span * (pointCount + 1) +
        pointCount * (pointWidth ?? pointLineLength);
    // 获取路径的测量信息
    PathMetrics pathMetrics = path.computeMetrics();
    // 遍历路径的各个部分进行绘制
    pathMetrics.forEach((PathMetric pathMetric) {
      // 计算每个部分包含的虚线段数
      final int count = (pathMetric.length / partLength).floor();
      for (int i = 0; i < count; i++) {
        // 绘制虚线段
        canvas.drawPath(
          pathMetric.extractPath(partLength * i, partLength * i + step),
          paint,
        );
        // 绘制点
        for (int j = 1; j <= pointCount; j++) {
          // 计算点的起始位置
          final start =
              partLength * i + step + span * j + pointLineLength * (j - 1);
          canvas.drawPath(
            pathMetric.extractPath(
                start, start + (pointWidth ?? pointLineLength)),
            paint,
          );
        }
      }
      // 绘制路径末尾的部分
      final double tail = pathMetric.length % partLength;
      canvas.drawPath(
        pathMetric.extractPath(pathMetric.length - tail, pathMetric.length),
        paint,
      );
    });
  }

  
  bool shouldRepaint(covariant CustomPainter oldDelegate) {
    return false;
  }
}

DashedRectPainter是一个自定义的画笔,用于在给定大小的画布上绘制虚线边框。它具有一些参数,如spansteppointCountpointWidthborderRadius,允许你自定义虚线的外观。

通过结合DashedRectBoxWidgetDashedRectPainter,我们可以创建出一个具有虚线边框的圆角矩形小部件。这个小部件非常灵活,可以根据需要进行定制,使得你的应用界面更加多样化。

希望这篇文章能够帮助你了解如何在Flutter中绘制虚线边框的圆角矩形,并且能够为你的项目带来一些启发。


http://www.niftyadmin.cn/n/5440457.html

相关文章

[Vuex]介绍和安装使用

什么是Vuex Vuex 是一个 Vue 的 状态管理工具 使用场景 某个状态 在 很多个组件 来使用 (个人信息) 多个组件 共同维护 一份数据 (购物车) 注意!!!官方原文&#xff1a; 不是所有的场景都适用于vuex&#xff0c;只有在必要的时候才使用vuex 使用了vuex之后&#xff0c;会…

vue3与Electron构建跨平台应用(webpack)

一、创建vue3项目 vue create vue3_webpack_electron 二、安装Electron npm install --save-dev electron Electron 三、vue add electron-builder vue add electron-builder

java基础知识点学习路线整理

1、Java基本语法&#xff1a; 1.变量和## 标题数据类型&#xff08;如int、double、String等&#xff09;。 2.运算符&#xff08;算术、关系、逻辑、位、赋值等&#xff09;。 3.控制流语句&#xff08;if-else、switch、for、while、do-while等&#xff09;数组和集合&#…

蓝桥杯每日一题:接龙数列

题目来源&#xff1a;第十四届蓝桥杯软件赛省赛 B组 对于一个长度为 K K K 的整数数列: A 1 A_1 A1​, A 2 A_2 A2​ , … , A K A_K AK​ , 我们称之为接龙数列当且仅当 A i A_i Ai​ 的首位数字恰好等于 A i − 1 A_{i-1} Ai−1​ 的末尾数字 ( 2 ≤ i ≤ K 2 \le i \l…

小狐狸ChatGPT智能聊天系统源码v2.7.6全开源Vue前后端+后端PHP

测试环境包括Linux系统的CentOS 7.6&#xff0c;宝塔面板&#xff0c;PHP 7.4和MySQL 5.6。网站的根目录是public&#xff0c; 使用thinkPHP进行伪静态处理&#xff0c;并已开启SSL证书。 该系统具有多种功能&#xff0c;包括文章改写、广告营销文案创作、编程助手、办公达人…

2024网络安全-自学笔记

前言 一、什么是网络安全 网络安全可以基于攻击和防御视角来分类&#xff0c;我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术&#xff0c;而“蓝队”、“安全运营”、“安全运维”则研究防御技术。 无论网络、Web、移动、桌面、云等哪个领域&#xff0c;都有攻与防…

Python模块-基础知识

Python模块-基础知识 1.模块分类&#xff1a; &#xff08;1&#xff09;自定义模块&#xff1a; 如果你自己写一个py文件&#xff0c;在文件内写入一堆函数&#xff0c;则它被称为自定义模块&#xff0c;即使用python编写的.py文件 &#xff08;2&#xff09;第三方模块&…

Figure 公司推出首款集成 OpenAI 大模型的自主人形机器人,开启与人类全面对话的新纪元

2024年3月13日&#xff0c;Figure&#xff0c;一家在人工智能机器人领域引领创新的公司&#xff0c;宣布推出了一款革命性的自主人形机器人。这款全新的 demo 机器人不仅标志着商业上可行的自主人形机器人技术的突破&#xff0c;更是通过整合 OpenAI 的先进大模型技术&#xff…