Flutter中自定义气泡框效果的实现

在用户界面的设计中,气泡框(Bubble)是一种非常有效的视觉工具,它可以用来突出显示信息或提示用户。气泡框广泛应用于聊天应用、通知提示等场景。在 Flutter 中,虽然有很多现成的气泡框组件,但如果你想要更多的自定义控制,使用 CustomPainter 是一个非常好的选择。在这篇博客中,我们将介绍如何使用 CustomPainter 自定义绘制气泡框,并将其应用到 Flutter 中。
具体效果如下:
在这里插入图片描述
在这里插入图片描述绘制气泡框

绘制气泡框

我们首先需要创建一个自定义的 CustomPainter 来绘制气泡框。以下是一个简单的 BubblePainter 类,它使用 Path 和 Paint 来绘制气泡框及其箭头。

import 'package:flutter/material.dart';class BubblePainter extends CustomPainter {final Color bubbleColor;final Color borderColor;final double arrowSize;BubblePainter({required this.bubbleColor,required this.borderColor,required this.arrowSize,});void paint(Canvas canvas, Size size) {final paint = Paint()..color = bubbleColor..style = PaintingStyle.fill;final borderPaint = Paint()..color = borderColor..style = PaintingStyle.stroke..strokeWidth = 1.0;final path = Path()..moveTo(10, 0)..lineTo(size.width - 6, 0)..quadraticBezierTo(size.width, 0, size.width, 6)..lineTo(size.width, size.height - 6)..quadraticBezierTo(size.width, size.height, size.width - 6, size.height)..lineTo(6, size.height)..quadraticBezierTo(0, size.height, 0, size.height - 6)..lineTo(0, 14)..lineTo(-arrowSize, 14 - (arrowSize / 2))..lineTo(0, 14 - arrowSize)..quadraticBezierTo(0, 0, 6, 0)..close();canvas.drawPath(path, paint);canvas.drawPath(path, borderPaint);}bool shouldRepaint(covariant CustomPainter oldDelegate) {return false;}
}

在 BubblePainter 类中,我们定义了气泡框的颜色、边框颜色和箭头大小。paint 方法负责绘制气泡框的实际内容。我们使用 Path 类绘制气泡框的形状,并通过 Paint 类设置绘制的颜色和样式。

创建自定义气泡组件

接下来,我们创建一个 CustomBubble 组件,将 BubblePainter 应用到 Flutter 的 CustomPaint 小部件中,并为气泡框添加文本内容。

class CustomBubble extends StatelessWidget {final String text;final TextStyle style;final Color bubbleColor;final Color borderColor;final double arrowSize;const CustomBubble({required this.text,required this.style,required this.bubbleColor,required this.borderColor,required this.arrowSize});Widget build(BuildContext context) {return CustomPaint(painter: BubblePainter(bubbleColor: bubbleColor,borderColor: borderColor,arrowSize: arrowSize),child: Padding(padding: const EdgeInsets.symmetric(horizontal: 10.0, vertical: 4),child: Text(text,style: style,),),);}
}

使用自定义气泡框

在实际应用中,你可以像下面这样使用 CustomBubble 组件:

            CustomBubble(text: 'Hello Flutter',style: TextStyle(fontSize: 12),bubbleColor: Colors.white,borderColor: Colors.red,arrowSize: 8)

以上代码创建了一个白色背景、红色边框的气泡框,文本内容为 “Hello Flutter”,箭头的大小为 8。

扩展和定制

以上示例提供了一种实现气泡框效果的方法,但你可以根据需要进行更多的定制和扩展。比如,你可以调整箭头的位置、改变气泡框的形状或添加渐变色效果。通过修改 BubblePainter 类中的绘制逻辑,你可以实现更加复杂和个性化的气泡框效果。

总结

通过使用 Flutter 的 CustomPainter,你可以灵活地创建自定义气泡框,并在应用中实现各种视觉效果。这种方法不仅可以用于聊天应用,还可以在提示框、通知等场景中发挥作用。希望这篇博客能帮助你理解如何使用 CustomPainter 绘制气泡框,并鼓励你在项目中应用和扩展这一技术。


http://www.ppmy.cn/news/1524958.html

相关文章

微深节能 天车位置跟踪物流信息管理系统 格雷母线

微深节能的天车位置跟踪物流信息管理系统结合格雷母线技术,为库房、冶金、矿山等场景的天车作业提供了高效、精准的位置跟踪和物流管理解决方案。 一、系统概述 微深节能的天车位置跟踪物流信息管理系统通过集成先进的格雷母线技术,实现了对天车位置的高…

python绘制3D瀑布图

成品: 代码: import matplotlib.pyplot as plt import matplotlib.ticker as ticker from mpl_toolkits.mplot3d.art3d import Poly3DCollection import numpy as npdef line_3d(x, y, z, x_label_indexs):"""在y轴的每个点,…

如何利用命令模式实现一个手游后端架构?

命令模式的原理解读 命令模式的英文翻译是 Command Design Pattern。在 GoF 的《设计模式》一书中,它是这么定义的: The command pattern encapsulates a request as an object, thereby letting us parameterize other objects with different reques…

能力追上博士生,OpenAI发布最强o1系列模型

9月13日凌晨1点,OpenAI发布o1系列模型,包括o1-preview(下称o1预览版)和o1-mini。针对这一消息,该公司创始人Sam Altman在X上表示:“no more patience, jimmy.(需要耐心等待的时刻结束了&#xf…

蓝桥杯DS18B20程序源码

蓝桥杯DS18B20程序源码解析 蓝桥杯,作为一项全国瞩目的电子设计竞赛,其核心挑战在于参赛者需深度融合单片机编程与各类电子元件的应用能力。在众多项目中,涉及DS18B20数字温度传感器的程序源码尤为引人注目,它巧妙地将单片机技术…

开源项目低代码表单FormCreate中ElementPlus表单使用校验规则示例

在开源项目低代码表单FormCreate 中,可以通过 validate 配置项为表单组件设置验证规则。无论是内置的表单组件还是自定义的表单组件,都支持表单校验。本文将详细介绍验证规则的使用方法,并提供一些示例来帮助您更好地理解和应用这些功能。 源…

ISO 21434与网络安全管理系统(CSMS)的协同作用

ISO/SAE 21434与CSMS(网络安全管理系统)之间的关系主要体现在以下几个方面: 提供指导框架:ISO/SAE 21434《道路车辆—网络安全工程》是一项国际标准,它为汽车行业提供了实施网络安全管理系统的国际认可的方法和最佳实…

模板匹配应用(opencv的妙用)

在图像处理领域,模板匹配是一种常用的技术,用于在一幅大图中寻找与给定模板最匹配的区域。OpenCV作为一个强大的计算机视觉库,提供了cv2.matchTemplate()函数来实现模板匹配功能。本文将详细介绍OpenCV中的模板匹配技术,包括其原理…

qmt量化交易策略小白学习笔记第64期【qmt编程之获取获取期权全推数据--code_list全推tick数据】

qmt编程之获取期权数据 qmt更加详细的教程方法,会持续慢慢梳理。 也可找寻博主的历史文章,搜索关键词查看解决方案 ! 获取期权全推数据 获取全推tick数据的函数是用户主动调用的工具。所谓"全推tick数据",指的是以t…

Android 应用使用theme处理全局焦点框

背景 我的应用有个需求,要求处理keycode事件,进行焦点移动处理,必须定制指定的焦点框。而系统的焦点框是固定了,为了保证平台的一致性,没办法直接修改。 问题 经过沟通,大部分都是自行修改了自己的backg…

ARM base instruction -- cset

CSET Conditional Set sets the destination register to 1 if the condition is TRUE, and otherwise sets it to 0. 如果条件为TRUE&#xff0c;则条件集将目标寄存器设置为1&#xff0c;否则设置为0。 32-bit variant Applies when sf 0. CSET <Wd>, <…

Spark MLlib模型训练—推荐算法 ALS(Alternative Least Squares)

Spark MLlib模型训练—推荐算法 ALS(Alternative Least Squares) 如果你平时爱刷抖音,或者热衷看电影,不知道有没有过这样的体验:这类影视 App 你用得越久,它就好像会读心术一样,总能给你推荐对胃口的内容。其实这种迎合用户喜好的推荐,离不开机器学习中的推荐算法。 在…

SimPO

添加链接描述 优化点两个&#xff1a; gamma长度正则 gamma 原始DPO把两部分母拿出来是 − l o g π r e f ( w i n ) π r e f ( l o s e ) -log \frac{\pi_{ref}(win)}{\pi_{ref}(lose)} −logπref​(lose)πref​(win)​ 由于构建数据集时常常把不满意的大模型输出作为…

操作系统 ---- 调度算法【先来先服务(FCFS)、最短作业优先(SJF)、最高响应比优先(HRRN)】

目录 一、常见的调度算法 1. 先来先服务&#xff08;FCFS, First-Come, First-Served&#xff09; 2. 最短作业优先&#xff08;SJF, Shortest Job First&#xff09; 3. 优先级调度&#xff08;Priority Scheduling algorithm&#xff0c;PSA&#xff09; 4. 轮转调度&am…

python 函数 封装

封装 函数的参数是&#xff1a;变量 def 函数(参数):print(参数)if __name__ __main__:函数(参数)函数(参数2)函数的参数是&#xff1a; 字典 import requests# 定义一个字典 data {} 地址 "https://webdriveruniversity.com/" 请求方法 getdata["url"…

Hi3519DV500_Uboot环境变量的编译和烧录

Hi3519DV500_Uboot环境变量的编译和烧录 U-Boot 环境变量在嵌入式系统的引导加载程序中扮演着重要的角色。它们用于存储系统启动时所需的配置信息&#xff0c;如启动命令、内核和根文件系统的位置、串口波特率等。以下是一些常用的 U-Boot 环境变量及其用途&#xff1a; bootde…

安宝特案例 | AR如何大幅提升IC封装厂检测效率?

前言&#xff1a;如何提升IC封装厂检测效率&#xff1f; 在现代电子产品的制造过程中&#xff0c;IC封装作为核心环节&#xff0c;涉及到复杂处理流程和严格质量检测。这是一家专注于IC封装的厂商&#xff0c;负责将来自IC制造商的晶圆进行保护、散热和导通处理。整个制程繁琐…

使用vuex模仿el-table

1、vuex 在main.js引入 import Vue from vue; import Vuex from vuex;Vue.use(Vuex);const store new Vuex.Store({state: {// 定义要传递的数据datas: []},mutations: {// 定义修改数据的 mutationSET_DATAS(state, newDatas) {state.datas newDatas;}},actions: {// 定义…

Java面试篇基础部分-Java的类加载机制

JVM的类加载 JVM在运行Java文件的时候,类加载分为5个阶段:加载、验证、准备、解析、初始化。在类初始化加载完成之后,就可以使用这个类的信息了。当这个类不需要使用的时候,就可以从JVM进行卸载。 加载 加载是指JVM读取Class文件的操作,并且根据Class的文件描述创建对应的…

聚鼎科技:现在做装饰画是靠谱的吗

在生活的各个角落&#xff0c;艺术以多种形式存在着&#xff0c;而装饰画作为其中的一种&#xff0c;一直以其独特的魅力填充着我们的世界。但在这个快速变化的时代&#xff0c;许多人会问&#xff1a;现在做装饰画还是一个靠谱的选择吗? 装饰画的市场依旧充满生机。随着人们对…