Android 圆形进度条CircleProgressView 基础版

一个最基础的自定义View 圆形进度条,可设置背景色、进度条颜色(渐变色)下载进度控制;可二次定制度高;

核心代码:

    @Overrideprotected void onDraw(@NonNull Canvas canvas) {super.onDraw(canvas);int mW = getMeasuredWidth();int mH = getMeasuredHeight();int centerX = mW/2;int centerY = mH/2;Log.i(TAG, "onDraw: "+mW +"-" +mH);//画背景色canvas.save();paintBg.setColor(backgroundColor);RectF rectBg = new RectF(strokeWidth,strokeWidth,mW-strokeWidth,mH-strokeWidth);canvas.drawArc(rectBg,0,360,false , paintBg);//画进度条颜色float ratio  = (float) Math.min(progress / max , 1.00);paint.setColor(loadingColor); //设置进度条颜色
//        SweepGradient sweepGradient = new SweepGradient(centerX , centerY , new int[]{loadingColor , Color.YELLOW} , null);
//        paint.setShader(sweepGradient); //设置进度条渐变色paint.setStrokeCap(Paint.Cap.ROUND); 设置画笔边缘为半圆状canvas.drawArc(rectBg,0,360*ratio,false , paint);canvas.restore();//画中间的文案paintText.setTextSize(dp2px(18));paintText.setColor(Color.BLACK);paintText.setTextAlign(Paint.Align.CENTER);Paint.FontMetrics fontMetrics = paintText.getFontMetrics();float disY = (fontMetrics.bottom - fontMetrics.top) / 2 - fontMetrics.bottom;canvas.drawText(progress+"%" , centerX , centerY+disY , paintText);}

全部代码:

package com.cuichen.mytestdemo.view;import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.Rect;
import android.graphics.RectF;
import android.graphics.SweepGradient;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;import androidx.annotation.NonNull;
import androidx.annotation.Nullable;import com.cuichen.mytestdemo.R;public class CircleProgressView extends View {private final String TAG = CircleProgressView.class.getSimpleName();public CircleProgressView(Context context) {super(context);}public CircleProgressView(Context context, @Nullable AttributeSet attrs) {super(context, attrs);initAttrs(attrs);}public CircleProgressView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);initAttrs(attrs);}public CircleProgressView(Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) {super(context, attrs, defStyleAttr, defStyleRes);initAttrs(attrs);}private void initAttrs( @Nullable AttributeSet attrs){TypedArray typedArray = getContext().obtainStyledAttributes(attrs , R.styleable.CircleProgress);try{backgroundColor = typedArray.getColor(R.styleable.CircleProgress_backgroundColorCircle , Color.parseColor("#5503DAC5"));loadingColor = typedArray.getColor(R.styleable.CircleProgress_progressColorCircle ,Color.parseColor("#FF018786"));strokeWidth = (int) typedArray.getDimension(R.styleable.CircleProgress_strokeWidthCircle , 18);max = typedArray.getInt(R.styleable.CircleProgress_maxCircle , 100);progress = typedArray.getInt(R.styleable.CircleProgress_progressCircle , 50);}catch (Exception e){typedArray.recycle();}}private int strokeWidth = 18;private float progress = 0f;private float max = 100f;private int backgroundColor;private int loadingColor;final int DEFAULT_HEIGHT_DP = 66;Paint paintBg , paint , paintText;void init(){paintBg = new Paint();paintBg.setAntiAlias(true);paintBg.setStyle(Paint.Style.STROKE);paintBg.setStrokeWidth(strokeWidth);paint = new Paint();paint.setAntiAlias(true);paint.setStyle(Paint.Style.STROKE);paint.setStrokeWidth(strokeWidth);paintText = new Paint();paintText.setAntiAlias(true);}public void setProgress(int progress){this.progress = progress;invalidate();}@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {super.onMeasure(widthMeasureSpec, heightMeasureSpec);Log.i(TAG, "onMeasure: ");int widthSpecSize = MeasureSpec.getSize(widthMeasureSpec);int heightSpecMode = MeasureSpec.getMode(heightMeasureSpec);int heightSpecSize = MeasureSpec.getSize(heightMeasureSpec);int height = 0;switch (heightSpecMode){case MeasureSpec.AT_MOST:height = dp2px(DEFAULT_HEIGHT_DP);break;case MeasureSpec.EXACTLY:case MeasureSpec.UNSPECIFIED:height = heightSpecSize;break;}setMeasuredDimension(widthSpecSize, height);if(paint == null) {init();}}//RectF//left:左边坐标;在绘制中常表示为起点的Y轴坐标//top:上边左边;在绘制中常表示为起点的X轴坐标//right:右边坐标;在绘制中常表示为终点的X轴坐标//bottom:下边坐标;在绘制中常表示为终点的Y轴坐标@Overrideprotected void onDraw(@NonNull Canvas canvas) {super.onDraw(canvas);int mW = getMeasuredWidth();int mH = getMeasuredHeight();int centerX = mW/2;int centerY = mH/2;Log.i(TAG, "onDraw: "+mW +"-" +mH);//画背景色canvas.save();paintBg.setColor(backgroundColor);RectF rectBg = new RectF(strokeWidth,strokeWidth,mW-strokeWidth,mH-strokeWidth);canvas.drawArc(rectBg,0,360,false , paintBg);//画进度条颜色float ratio  = (float) Math.min(progress / max , 1.00);paint.setColor(loadingColor); //设置进度条颜色
//        SweepGradient sweepGradient = new SweepGradient(centerX , centerY , new int[]{loadingColor , Color.YELLOW} , null);
//        paint.setShader(sweepGradient); //设置进度条渐变色paint.setStrokeCap(Paint.Cap.ROUND); 设置画笔边缘为半圆状canvas.drawArc(rectBg,0,360*ratio,false , paint);canvas.restore();//画中间的文案paintText.setTextSize(dp2px(18));paintText.setColor(Color.BLACK);paintText.setTextAlign(Paint.Align.CENTER);Paint.FontMetrics fontMetrics = paintText.getFontMetrics();float disY = (fontMetrics.bottom - fontMetrics.top) / 2 - fontMetrics.bottom;canvas.drawText(progress+"%" , centerX , centerY+disY , paintText);}private int dp2px(int dp){float density = getContext().getResources().getDisplayMetrics().density;return (int) (dp * density);}
}
    <declare-styleable name="CircleProgress"><attr name="backgroundColorCircle" format="color"/><attr name="progressColorCircle" format="color"/><attr name="strokeWidthCircle" format="dimension"/><attr name="maxCircle" format="integer"/><attr name="progressCircle" format="integer"/></declare-styleable>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/58651.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

防抖与节流 - 2024最新版前端秋招面试短期突击面试题【100道】

防抖与节流 - 2024最新版前端秋招面试短期突击面试题【100道】 ⏲️ 在JavaScript中&#xff0c;防抖&#xff08;Debouncing&#xff09;与节流&#xff08;Throttling&#xff09;是两种常用的性能优化技术&#xff0c;尤其在处理频繁触发的事件时&#xff0c;如滚动、窗口调…

SSH登录介绍

说明&#xff1a;一般登录服务器&#xff0c;我们可以用远程连接工具&#xff0c;如XShell、Windterm等&#xff0c;或者通过公司搭建的JumpServer&#xff08;跳板机、堡垒机&#xff09;来连接。前者是点对点登录&#xff0c;输入主机、端口&#xff0c;通过SSH协议登录&…

中信银行西安分行完成首笔上市公司股票回购增持专项贷款审批

10月18日上午&#xff0c;中国人民银行联合国家金融监管总局、中国证监会发布《关于设立股票回购增持再贷款有关事宜的通知》&#xff0c;创新推出股票回购增持专项再贷款货币政策工具&#xff0c;旨在鼓励金融机构支持上市公司回购和股票增持&#xff0c;进一步提振市场信心&a…

ValueError: Object arrays cannot be loaded when allow_pickle=False

文章目录 问题解决方法1&#xff1a;allow_pickleTrue解决方法2&#xff1a;降低numpy版本错误原因&#xff1a;python和numpy版本不兼容 问题 Traceback (most recent call last): File “D:\project\test_st\retrieval\read_npy.py”, line 4, in data np.load(‘mosi0__le…

如何使用 Python 批量检测和转换 JSONL 文件编码为 UTF-8

如何使用 Python 批量检测和转换 JSONL 文件编码为 UTF-8 在日常开发中&#xff0c;我们经常会遇到不同编码格式的文件&#xff0c;比如 UTF-8、ASCII、Windows-1252、ISO-8859-1 等。文件编码不一致可能导致读取或处理文件时出现乱码&#xff0c;特别是在批量处理数据文件时。…

【三十八】【QT开发应用】vlcplayer视频播放器(一)实现视频播放,视频暂停,视频停止,进度条调节,音量调节,时长显示功能

效果展示 vlcplayer_test视频播放器 MainWidget.ui 注意控件的布局和命名&#xff0c;控件的命名和信号与槽函数的绑定有关&#xff0c;所以这点很重要。 下载VLC组件和环境配置 videolan下载地址我下载的是vlc-3.0.8-win64版本. 将下载的文件复制粘贴到项目文件中. 复制粘…

PostgreSQL中查询每个账号的最新和最新前的数据

问题背景 有时候我们需要PostgreSQL中查询每个账号的最新和最新前的数据&#xff0c;也就是Rank12的数据供使用。 解决方案 如果PostgreSQL中查询每个账号的最新和最新前的数据&#xff0c;我们可以使用窗口函数来实现。窗口函数允许我们对数据进行分区&#xff0c;然后在每个…

linux上trace code的几种方法

我们在看代码时&#xff0c;总是会遇到下面问题&#xff1a; 1.查看某个场景下的代码执行流 2.查看某个函数被执行时的routine 但是&#xff0c;如果直接查看源码&#xff0c;源码可能代码量大&#xff0c;且分支多&#xff0c;不容易理清。就需要让相关程序运行起来查看。 …

《论文写作》课程心得

《论文写作》课程心得 在学习闵帆老师的《论文写作》课程后&#xff0c;结合平时观察同门的论文评改过程&#xff0c;我对论文写作有了新的体会。因此&#xff0c;我写下这篇博客&#xff0c;作为我对论文写作的总结。在我看来&#xff0c;论文写作这门课虽然主要讲的是如何写…

【LeetCode每日一题】——1791.找出星型图的中心节点

文章目录 一【题目类别】二【题目难度】三【题目编号】四【题目描述】五【题目示例】六【题目提示】七【解题思路】八【时空频度】九【代码实现】十【提交结果】 一【题目类别】 图 二【题目难度】 简单 三【题目编号】 1791.找出星型图的中心节点 四【题目描述】 有一个…

深入了解 美国高防 CN2 :如何提升全球化业务的网络安全与性能

美国高防 CN2 的重要性 在跨国企业和全球化业务的不断扩展下&#xff0c;对高性能和安全的网络连接需求不断增加。美国高防 CN2&#xff08;Global Internet Access&#xff09;以其卓越的跨境传输效率和强大的防护能力&#xff0c;成为许多企业关注的焦点。尤其是对电商、游戏…

Endnote如何关联Word,在Word上通过Endnote插入文献

1、Word版本已被激活 首先检查Word版本是否已经被激活&#xff0c;不管是正版还是破解版&#xff0c;未激活状态&#xff08;试用&#xff09;可能会导致关联不成功。如下图所示为已激活版本&#xff0c;在“文件”—“账户”可看。 2、勾选开发工具 其次&#xff0c;打开Wor…

1688旺铺主页首页装修 代码 首页悬浮视频怎么做?阿里巴巴代码装修悬浮视频代码固定视频悬浮漂浮视频

1688旺铺主页首页装修 代码 首页悬浮视频怎么做&#xff1f;阿里巴巴代码装修悬浮视频代码固定视频悬浮漂浮视频 一秒美工工具

VB中如何处理国际化(Internationalization)和本地化(Localization)

在Visual Basic (VB) 中处理国际化&#xff08;Internationalization&#xff0c;简称 i18n&#xff09;和本地化&#xff08;Localization&#xff0c;简称 l10n&#xff09;是一个多步骤的过程&#xff0c;涉及准备应用程序以支持多种语言和文化&#xff0c;以及为每种目标语…

【错误描述:“L2TP连接尝试失败,因为安全层在初始化与远程计算机的协商时遇到了一个处理错误”】

解决办法&#xff1a; 一、检查并更改网络协议 &#xff08;如果网络协议更改完成&#xff0c;还是链接失败&#xff0c;直接看 第二点&#xff09; 1、打开网络和Internet 设置 2、找到更改适配器选项 3、先择你要链接VPN&#xff0c;右键选择属性&#xff0c;之后选择安…

postgresql杀掉数据库连接阻塞

在PostgreSQL中&#xff0c;如果你想杀掉一个阻塞其他数据库操作的数据库连接&#xff0c;你可以使用pg_terminate_backend函数。这个函数需要一个backend ID&#xff0c;你可以从pg_stat_activity视图中获取。 以下是一个SQL命令的例子&#xff0c;用于杀掉阻塞其他操作的数据…

基于SSM学生竞赛模拟系统的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;用户管理&#xff0c;公告信息管理&#xff0c;试题管理&#xff0c;论坛交流&#xff0c;试卷管理&#xff0c;系统管理 前台账号功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;公告…

罗马仕、西圣、安克充电宝哪款品牌更好?综合测评对比谁是TOP.1

罗马仕、西圣、安克充电宝哪款品牌更好&#xff1f;在移动设备日益普及的今天&#xff0c;充电宝已成为许多人的必备配件。市场上涌现出多个知名品牌的充电宝&#xff0c;其中罗马仕、西圣和安克尤为受到消费者的关注。这三个品牌在产品质量、技术创新和用户体验方面各有千秋&a…

在 Ubuntu 22.04 上部署Apache 服务, 访问一张照片

要在 Ubuntu 22.04 上部署一张照片&#xff0c;使其可以通过 Apache 访问&#xff0c;你可以按照以下步骤进行操作&#xff1a; 1. 安装 Apache&#xff08;如果尚未安装&#xff09; 如果你还没有安装 Apache&#xff0c;可以使用以下命令&#xff1a; sudo apt update sud…

WSL2打开x11应用报错Error: Can‘t open display: :0

Environment&#xff1a; WSL 版本&#xff1a; 2.3.24.0 内核版本&#xff1a; 5.15.153.1-2 WSLg 版本&#xff1a; 1.0.65 MSRDC 版本&#xff1a; 1.2.5620 Direct3D 版本&#xff1a; 1.611.1-81528511 DXCore 版本&#xff1a; 10.0.26100.1-240331-1435.ge-release Wind…