Flutter 進階:實現帶圓角的 CircularProgressIndicator

在 Flutter 中,我們經常使用 CircularProgressIndicator 來展示加載進度。但是你是否注意到:它的進度端始終是“平頭”的(直角)

這在一些 UI 設計中并不美觀,特別是想實現類似 Apple 健身環那樣“前端圓清澈”效果時,就需要一個帶圓角的圓形進度條。


🛠 方法一:使用 CustomPaint 自繪圓角進度

Flutter 的 Canvas 提供了繪制弧形和給進度端點設置樣式的能力,我們只需設置 Paint.strokeCap = StrokeCap.round 就可以讓進度端頭變成圓角。

→ 實現代碼:

class RoundedCircularProgressIndicator extends StatelessWidget {final double progress;final double size;final double strokeWidth;final Color backgroundColor;final Color progressColor;const RoundedCircularProgressIndicator({super.key,required this.progress,this.size = 40.0,this.strokeWidth = 6.0,this.backgroundColor = const Color(0xFFE0E0E0),this.progressColor = Colors.blue,});Widget build(BuildContext context) {return SizedBox(width: size,height: size,child: CustomPaint(painter: _RoundedCircularProgressPainter(progress: progress,strokeWidth: strokeWidth,backgroundColor: backgroundColor,progressColor: progressColor,),),);}
}class _RoundedCircularProgressPainter extends CustomPainter {final double progress;final double strokeWidth;final Color backgroundColor;final Color progressColor;_RoundedCircularProgressPainter({required this.progress,required this.strokeWidth,required this.backgroundColor,required this.progressColor,});void paint(Canvas canvas, Size size) {final center = size.center(Offset.zero);final radius = (size.width - strokeWidth) / 2;final rect = Rect.fromCircle(center: center, radius: radius);final backgroundPaint = Paint()..color = backgroundColor..style = PaintingStyle.stroke..strokeWidth = strokeWidth;final progressPaint = Paint()..color = progressColor..style = PaintingStyle.stroke..strokeWidth = strokeWidth..strokeCap = StrokeCap.round; // 圓角關鍵canvas.drawArc(rect, 0, 2 * pi, false, backgroundPaint);canvas.drawArc(rect, -pi / 2, 2 * pi * progress, false, progressPaint);}bool shouldRepaint(CustomPainter oldDelegate) => true;
}

→ 使用示例:

RoundedCircularProgressIndicator(progress: 0.75,size: 80,strokeWidth: 10,backgroundColor: Colors.grey.shade300,progressColor: Colors.green,
),

效果:圓角端頭,進度從頂部開始順時針繪制,大氣現代。


📆 方法二:使用第三方庫 percent_indicator

percent_indicator 是非常流行的進度指示器庫,支持 circularStrokeCap: CircularStrokeCap.round

安裝依賴

dependencies:percent_indicator: ^4.2.5

使用示例

CircularPercentIndicator(radius: 40.0,lineWidth: 8.0,percent: 0.6,circularStrokeCap: CircularStrokeCap.round,backgroundColor: Colors.grey.shade300,progressColor: Colors.purple,
),

很方便,適合快速開發場景。


? Flutter 自帶的 CircularProgressIndicator 存在的限制

Flutter 默認的 CircularProgressIndicator 沒有揭露 strokeCap 設置,不支持圓角端。

如果你想要實現“前端圓角”效果,當前只能選擇:

  1. 自繪
  2. 第三方庫

📊 方法對比

方法是否支持圓角自定義能力使用難度推薦度
CustomPaint 自繪?????
percent_indicator?????
CircularProgressIndicator???

? 總結

本文介紹了如何在 Flutter 中實現 帶圓角的圓形進度條,通過:

  • 自繪 CustomPaint
  • 第三方庫 percent_indicator

這些技巧可以使進度 UI 更加精致,滿足更復雜的產品設計需求。


🐾 后記

如果你正在開發帶上傳進度、音頻處理、視頻模塊等場景,圓角進度條會大大提升用戶體驗。

歡迎點贊、收藏、評論!有任何 Flutter 相關問題也可以留言一起探討!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/912985.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/912985.shtml
英文地址,請注明出處:http://en.pswp.cn/news/912985.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

解決CentOS7下載docker-compose出現沒有可用軟件包問題

1 問題描述 今天在使用虛擬機CentOS 7系統安裝docker-compose時,用的是aliyun鏡像,出現沒有可用軟件包的問題,這就說明不是因為網絡,而是因為aliyun鏡像沒有該軟件包。 2 解決辦法 這里推薦最穩定的解決辦法,去docker-…

基于SpringBoot+Vue的酒類倉儲管理系統

文檔包含用例圖、系統架構圖、系統功能結構圖、實體屬性圖、總體e-r圖。一.系統開發工具與環境搭建1.系統設計開發工具后端使用Java編程語言的Spring boot框架項目架構:B/S架構運行環境:win10/win11、jdk17前端:技術:框架Vue.js&a…

月付物理服務器租用平臺-青蛙云

青蛙云物理服務器租用服務概述 青蛙云是一家提供物理服務器租用服務的平臺,支持月付、年付等靈活付費方式,物理服務器適合企業或個人用戶的高性能計算需求。其服務覆蓋多地區機房,提供多種配置選項,支持定制化需求。 核心優勢 …

基于二分類方法和安全系數方法使用comsol with matlab蒙特卡洛模擬實現邊坡失效概率計算——隨機變量模型

基于二分類方法和安全系數方法使用comsol with matlab蒙特卡洛模擬實現邊坡失效概率計算——隨機變量模型 模型和全部代碼下載隨機變量模擬加載comsol模型蒙特卡洛模擬(分類模型)蒙特卡洛模擬(安全系數模型)內聚力和內摩擦角隨機變量分布二分類穩定性1000次運行結果失效概率…

機器學習-02(深度學習的基本概念)

機器學習的步驟 1.定義帶有未知參數的函數 線性模型(linear models)具有較大的限制(Model Bias) y b wx 無論如何更改b或者w,其只會呈現出一條直線,不能滿足更加復雜的現實情況。 我們可以將復雜的函…

InspireFace C++ 架構分析

InspireFace C 架構分析 https://github.com/deepinsight/insightface/tree/master/cpp-package/inspireface 1. 項目概述 InspireFace 是一個高性能的人臉識別和分析 SDK,采用 C 開發,提供了完整的人臉檢測、跟蹤、特征提取、活體檢測、屬性分析等功…

【網絡安全】Webshell命令執行失敗解決思路

前言費盡心思上傳了webshell,上傳下載都沒問題,卻發現命令執行總是失敗?最近也打點也遇到了這些問題,網上有部分文章,但都是零碎知識點并且實戰不一定能用,今天就結合我個人經驗剖析webshell上線后cmd命令執…

【機器人】復現 HOV-SG 機器人導航 | 分層 開放詞匯 | 3D 場景圖

HOV-SG 是通過語言指令實現機器人導航的,核心特點是分層結構、開放詞匯、3D場景圖。 來自RSS 2024,大規模、多層次的環境構建精確的、開放詞匯的3 場景圖,并使機器人能夠通過語言指令在其中有效地導航。 論文地址:Hierarchical …

jvm 鎖升級機制

Java 虛擬機(JVM)中的鎖升級機制(也稱為鎖膨脹)是 HotSpot 虛擬機為了優化 synchronized 關鍵字的性能而引入的一項重要技術。它的核心思想是:根據實際遇到的競爭激烈程度,動態地將鎖從開銷最小的狀態逐步升…

金蝶云星空 (9.0版本) ERP的WebApi接口隨機出現SSLException

環境: java-1.8.0-openjdk-1.8.0.131 hutool-all 依賴, 5.8.25版本 項目背景: 發版上線,用的hutool工具類 HttpUtil.createPost() ,請求域名為https://xxx.ik3cloud.com/k3cloud 的金蝶ERP webapi接口 問題&#xff1…

用java,把12.25.pdf從最后一個點分割,得到pdf

要在Java中從文件名 12.25.pdf 的最后一個點(.)分割文件名和擴展名,可以使用 String 類的 lastIndexOf() 和 substring() 方法。以下是一個示例代碼: public class FileNameSplitter {public static void main(String[] args) {St…

UE5 重新編譯插件版本

打開要轉換的UE的安裝目錄,一直找到這個文件 不要雙擊,在地址欄里輸入cmd打開命令行,輸入如下指令 RunUAT.bat BuildPlugin -plugin"E:\OldPlugin\chatbot5.3\chatbot\chatbot.uplugin" -package"E:\NewPlugin"-plugin…

Linux下的調試器-gdb(16)

文章目錄 預備知識(9-2.30.00)快速認識 gdbgdb 的命令1. 更換成 cgdb2. 打和去除斷點3. 逐語句與逐過程4. 使能(激活)斷點 調試思想1. 找到問題(找到問題所在的區域)2. 查看代碼的上下文 補充調試技巧1. wa…

李宏毅NLP-7-計算分數和訓練和測試

文章目錄 分數計算訓練測試 分數計算 插入式序列生成模型的概率計算邏輯,核心是將 “生成序列 h 的過程” 拆解為一系列插入操作,并通過步驟概率的乘積計算總概率 P ( h ∣ X ) P(h∣X) P(h∣X)。以下從 模型框架、步驟分解、概率計算 三個層面解析&…

Python字符與ASCII轉換方法

在Python中,可以使用內置函數 ord() 和 chr() 來轉換字符和ASCII碼: ?獲取字符的ASCII碼? - 用 ord() ascii_code ord(A) # 返回 65 ?將ASCII碼轉為字符? - 用 chr() character chr(65) # 返回 A 示例: # 打印字母A-Z的ASCII碼…

[IMX][UBoot] 10.啟動流程 (6) - bootz 命令啟動 Linux

文章鏈接 UBoot 啟動流程 (1) - 基本流程 UBoot 啟動流程 (2) - 平臺前期初始化階段 - board_init_f UBoot 啟動流程 (3) - UBoot 程序重定位 - relocate_code UBoot 啟動流程 (4) - 平臺后期初始化階段 - board_init_r UBoot 啟動流程 (5) - UBoot 運行階段 - main_loop …

TCP 三次握手協商 MSS 前,如何確定 MSS 值(結合 Linux 內核源碼分析)

文章目錄 一、SYN總結影響 SYN MSS 的因素 二、SYNACK總結影響 SYNACK MSS 的因素 結合 Linux 內核源碼 一、SYN 總結影響 SYN MSS 的因素 套接字選項 TCP_MAXSEG路由選項 advmss出口 MTU 減去 40(TCP 和 IP 的固定首部大小)IPV4_MAX_PMTU - 40(同上) 二、SYNACK 總結影響 SY…

面試150 矩陣置0

思路 我們使用兩個標記集合,分別記錄當矩陣的元素為0的時候的橫、縱坐標。然后在對矩陣元素進行遍歷,如果所在行或者所在列的索引在集合中,對應的矩陣元素修改為0即可 class Solution:def setZeroes(self, matrix: List[List[int]]) -> N…

Element UI 完整使用實戰示例

以下是 Element UI 的完整使用實戰示例,涵蓋從環境搭建、基礎組件使用到項目實戰的全流程,結合多個實際場景和代碼示例: 一、環境搭建與基礎配置 1. 安裝 Element UI 通過 npm 或 yarn 安裝: npm install element-ui --save # …

C# 線程同步(一)同步概念介紹

目錄 1.阻塞(Blocking) 2.阻塞 VS 輪詢 3.線程狀態 到目前為止,我們已經闡述了如何在線程上啟動任務、配置線程以及實現雙向數據傳遞。同時,我們也說明了局部變量是線程私有的,而引用可以通過共享字段在線程間傳遞以…