发布时间:2026/7/16 19:02:24
从源码解析MagicProgressWidget:Android进度控件实现原理 从源码解析MagicProgressWidgetAndroid进度控件实现原理【免费下载链接】MagicProgressWidgetMagicProgressCircle MagicProgressBar项目地址: https://gitcode.com/gh_mirrors/ma/MagicProgressWidgetMagicProgressWidget是一个专为Android平台设计的轻量级进度控件库包含MagicProgressCircle圆形进度条和MagicProgressBar线性进度条两种核心组件。本文将从源码角度深入剖析这两个控件的实现原理帮助开发者理解其内部工作机制和自定义方法。控件初始化与属性定义MagicProgressWidget通过自定义属性实现灵活配置所有可配置属性都在library/src/main/res/values/attrs.xml文件中定义declare-styleable nameMagicProgressCircle attr namempc_percent formatfloat / attr namempc_stroke_width formatdimension / attr namempc_start_color formatcolor / attr namempc_end_color formatcolor / attr namempc_default_color formatcolor / attr namempc_foot_over_head formatboolean/ /declare-styleable declare-styleable nameMagicProgressBar attr namempb_percent formatfloat / attr namempb_fill_color formatcolor / attr namempb_background_color formatcolor / attr namempb_flat formatboolean / /declare-styleable在Java代码中控件通过构造函数解析这些属性。以MagicProgressCircle为例其构造函数实现如下public MagicProgressCircle(Context context, AttributeSet attrs) { this(context, attrs, 0); } public MagicProgressCircle(Context context, AttributeSet attrs, int defStyleAttr) { this(context, attrs, defStyleAttr, 0); } public MagicProgressCircle(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { super(context, attrs, defStyleAttr, defStyleRes); // 初始化代码 typedArray context.obtainStyledAttributes(attrs, R.styleable.MagicProgressCircle); percent typedArray.getFloat(R.styleable.MagicProgressCircle_mpc_percent, defaultPercent); strokeWidth (int) typedArray.getDimension(R.styleable.MagicProgressCircle_mpc_stroke_width, strokeWdithDefaultValue); // 其他属性解析 }MagicProgressCircle实现原理核心绘制逻辑圆形进度条的绘制主要在onDraw方法中完成通过Canvas绘制背景圆环和进度圆弧protected void onDraw(Canvas canvas) { super.onDraw(canvas); final int restore canvas.save(); // 计算中心点和半径 float cx getWidth() / 2; float cy getHeight() / 2; float radius Math.min(cx, cy) - strokeWidth / 2; // 绘制背景圆环 paint.setColor(defaultColor); canvas.drawCircle(cx, cy, radius, paint); // 绘制进度圆弧 if (drawPercent 0) { // 绘制前半圆 canvas.save(); canvas.rotate(90f, cx, cy); canvas.drawArc(rectF, 0f, 180f * drawPercent, true, startPaint); canvas.restore(); // 绘制后半圆当进度超过50%时 if (drawPercent 0.5f) { canvas.save(); canvas.rotate(270f, cx, cy); canvas.drawArc(rectF, 0f, 180f * (drawPercent - 0.5f), true, endPaint); canvas.restore(); } } canvas.restoreToCount(restore); }颜色渐变实现MagicProgressCircle支持从开始颜色到结束颜色的渐变效果通过calculatePercentEndColor方法动态计算中间颜色值private void calculatePercentEndColor(float percent) { if (percent 0.5f) { // 前半段使用开始颜色 startPaint.setColor(startColor); endPaint.setColor(startColor); } else { // 后半段计算渐变色 float colorPercent (percent - 0.5f) / 0.5f; int red (int) (Color.red(startColor) (Color.red(endColor) - Color.red(startColor)) * colorPercent); int green (int) (Color.green(startColor) (Color.green(endColor) - Color.green(startColor)) * colorPercent); int blue (int) (Color.blue(startColor) (Color.blue(endColor) - Color.blue(startColor)) * colorPercent); endPaint.setColor(Color.rgb(red, green, blue)); } }MagicProgressBar实现原理线性进度绘制线性进度条的绘制同样在onDraw方法中实现支持两种样式圆角矩形和扁平样式protected void onDraw(Canvas canvas) { super.onDraw(canvas); float drawPercent percent; canvas.save(); // 计算进度条宽度 float fillWidth drawPercent * width; // 绘制背景 backgroundPaint.setColor(backgroundColor); canvas.drawRoundRect(rectF, radius, radius, backgroundPaint); // 绘制进度 fillPaint.setColor(fillColor); if (fillWidth radius * 2) { // 进度较小时绘制左半圆 canvas.drawArc(rectF, 90, 180, true, fillPaint); } else if (fillWidth width - radius * 2) { // 进度较大时绘制完整进度条和右半圆 canvas.drawRoundRect(rectF, radius, radius, fillPaint); } else { // 中间进度绘制矩形 canvas.drawRect(0, 0, fillWidth, height, fillPaint); } canvas.restore(); }平滑动画实现两个控件都实现了ISmoothTarget接口支持进度的平滑过渡动画Override public void setSmoothPercent(float percent, int duration) { ValueAnimator animator ValueAnimator.ofFloat(getPercent(), percent); animator.setDuration(duration); animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { Override public void onAnimationUpdate(ValueAnimator animation) { setPercent((float) animation.getAnimatedValue()); } }); animator.start(); }实际应用示例在Demo项目中MainActivity展示了如何在布局文件中声明并在代码中控制这些控件// 初始化控件 demoMpc (MagicProgressCircle) findViewById(R.id.demo_mpc); demo1Mpb (MagicProgressBar) findViewById(R.id.demo_1_mpb); // 设置进度 demoMpc.setPercent(0.75f); demo1Mpb.setSmoothPercent(0.6f, 1000);自定义与扩展开发者可以通过以下方式扩展MagicProgressWidget的功能添加新属性在attrs.xml中定义新的自定义属性重写绘制方法继承MagicProgressCircle或MagicProgressBar并重写onDraw方法扩展动画效果实现ISmoothTarget接口添加自定义动画通过这些扩展点开发者可以轻松定制出符合自己应用风格的进度控件。总结MagicProgressWidget通过简洁的代码实现了功能丰富的进度控件其核心原理是利用Android的Canvas绘制API结合属性动画实现平滑过渡效果。理解其实现原理不仅有助于更好地使用这个库也为开发自定义Android控件提供了参考思路。无论是圆形进度条还是线性进度条MagicProgressWidget都提供了足够的自定义选项满足不同场景的需求。【免费下载链接】MagicProgressWidgetMagicProgressCircle MagicProgressBar项目地址: https://gitcode.com/gh_mirrors/ma/MagicProgressWidget创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

2026/7/16 18:57:24

怎么选择靠谱AI论文生成工具?看完我的试用都会明白!

2026年上半年开始AI论文写作工具开始火了,层出不穷!作为一个经常需要写论文的懒人,我非常好奇这些AI工具的实际效果到底怎么样?为了测试不同工具的实力,我对他们都进行了试用,发现了一些意想不到的结果....…

2026/7/16 18:57:24

VCSEL和VCSEL阵列仿真

垂直腔面发射激光器 (VCSEL) 是一种上升的技术,以其可靠性和波长稳定性以及发射光束的良好质量而闻名。 出于这个原因,它们通常用于各种应用,例如 分束器和图案的生成。在 VirtualLab Fusion 中,新引入的多光源允许定义单个 VCSEL…

2026/7/16 18:57:24

告别PPT制作焦虑:3分钟用nodeppt+Mermaid打造专业技术演示

告别PPT制作焦虑:3分钟用nodepptMermaid打造专业技术演示 【免费下载链接】nodeppt This is probably the best web presentation tool so far! 项目地址: https://gitcode.com/gh_mirrors/no/nodeppt 还在为技术分享、产品演示或学术汇报而烦恼吗&#xff1…

2026/7/16 19:57:51

法律AI技术路线图:从底座模型到专业法务系统的演进与实战

法律AI技术路线图:从底座模型到专业法务系统的演进与实战 【免费下载链接】Awesome-Chinese-LLM 整理开源的中文大语言模型,以规模较小、可私有化部署、训练成本较低的模型为主,包括底座模型,垂直领域微调及应用,数据集…

2026/7/16 19:57:51

专为零基础打造|池小鸿日语App,学日语的起点在这里

对于许多日语初学者来说,五十音图记不住、单词背了就忘、找不到适合自己的学习节奏一这些问题常常成为入门路上的第一道坎。池小鸿教育推出的【池小鸿日语App】,正是专为零基础学习者打造的一款一站式日语学习工具。该款App集零基础入门、查词解读、精听…

2026/7/16 19:57:51

安卓手机运行Linux环境:移动AI开发新方案

1. 安卓手机上的Linux环境:AI开发的移动革命在安卓手机上运行完整的Linux环境听起来像是天方夜谭,但这项技术正在彻底改变移动AI开发的游戏规则。作为一名长期从事移动端AI开发的工程师,我亲身体验过在手机上进行深度学习模型训练和推理的种种…

2026/7/16 19:57:51

如何快速掌握jiant NLP工具包:面向开发者的完整实践指南

如何快速掌握jiant NLP工具包:面向开发者的完整实践指南 【免费下载链接】jiant jiant is an nlp toolkit 项目地址: https://gitcode.com/gh_mirrors/ji/jiant jiant是一个功能强大的NLP工具包,专为多任务学习和迁移学习设计,支持超过…

2026/7/15 17:04:06

3步解锁音乐自由:ncmdumpGUI终极NCM文件解密转换指南

3步解锁音乐自由:ncmdumpGUI终极NCM文件解密转换指南 【免费下载链接】ncmdumpGUI C#版本网易云音乐ncm文件格式转换,Windows图形界面版本 项目地址: https://gitcode.com/gh_mirrors/nc/ncmdumpGUI 你是否曾在网易云音乐下载了心爱的歌曲&#…

2026/7/15 22:21:34

CANoe 19 SP3 配置 GB/T 27930-2023 A类系统:3步搭建BMS仿真测试环境

CANoe 19 SP3 配置 GB/T 27930-2023 A类系统:3步搭建BMS仿真测试环境随着新能源汽车行业的快速发展,充电通信协议的标准化和测试验证变得尤为重要。GB/T 27930-2023作为中国智能充电协议的最新版本,对充电机与电动汽车之间的通信提出了更严格…

2026/7/15 23:18:22

3步搞定RTL8852BE驱动:从零开始配置Wi-Fi 6网卡

3步搞定RTL8852BE驱动:从零开始配置Wi-Fi 6网卡 【免费下载链接】rtl8852be Realtek Linux WLAN Driver for RTL8852BE 项目地址: https://gitcode.com/gh_mirrors/rt/rtl8852be 还在为Linux系统无法识别RTL8852BE Wi-Fi 6网卡而烦恼吗?&#x1f…

2026/7/16 0:04:06

AD9215BRUZRL7-105是一款工业 10bit 流水线模数转换器

型号介绍AD9215BRUZRL7-105 是一款10 位单通道高速流水线模数转换器,它采用模拟单电源独立供电 数字驱动分离供电双电源架构,模拟电源 AVDD 额定 3V,允许工作区间 2.7V~3.3V;数字驱动电源 DRV 独立设计,支持 2.25V~3.…

2026/7/16 0:04:06

LTC4418IUF#TRPBF是一款工业级双通道控制器

型号介绍LTC4418IUF#TRPBF 是一款工业级双通道电源路径控制器,它芯片采用 20 引脚 4mm4mm QFN 封装,底部附带外露散热焊盘作为 21 号 GND 引脚,热阻 θJA 为 47℃/W、θJC 仅 4.5℃/W,散热性能适配大功率切换场景;温区…

2026/7/16 0:04:06

uos-exporter核心组件解析:10个关键监控导出器功能详解

uos-exporter核心组件解析:10个关键监控导出器功能详解 【免费下载链接】uos-exporter uos-exporter collects metrics from os 项目地址: https://gitcode.com/openeuler/uos-exporter 前往项目官网免费下载:https://ar.openeuler.org/ar/ uos-…

2026/7/16 13:58:36

3个高效策略:快速掌握Axure中文界面配置

3个高效策略:快速掌握Axure中文界面配置 【免费下载链接】axure-cn Chinese language file for Axure RP. Axure RP 简体中文语言包。支持 Axure 11、10、9。不定期更新。 项目地址: https://gitcode.com/gh_mirrors/ax/axure-cn 还在为Axure RP的英文界面感…