android实现圆形进度条

在这里插入图片描述

/*** date:2021/1/4 0004* author:wsm (Administrator)* funcation:圆形进度条控件*/public class CircleProgressView extends View {private Paint mBackPaint, mProgPaint;   // 绘制画笔private RectF mRectF;       // 绘制区域private int[] mColorArray;  // 圆环渐变色private int mProgress;      // 圆环进度(0-100)public CircleProgressView(Context context) {this(context, null);}public CircleProgressView(Context context, @Nullable AttributeSet attrs) {this(context, attrs, 0);}public CircleProgressView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);@SuppressLint("Recycle")TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.CircularProgressView);// 初始化背景圆环画笔mBackPaint = new Paint();mBackPaint.setStyle(Paint.Style.STROKE);    // 只描边,不填充mBackPaint.setStrokeCap(Paint.Cap.ROUND);   // 设置圆角mBackPaint.setAntiAlias(true);              // 设置抗锯齿mBackPaint.setDither(true);                 // 设置抖动mBackPaint.setStrokeWidth(typedArray.getDimension(R.styleable.CircularProgressView_backWidth, 5));mBackPaint.setColor(typedArray.getColor(R.styleable.CircularProgressView_backColor, Color.LTGRAY));// 初始化进度圆环画笔mProgPaint = new Paint();mProgPaint.setStyle(Paint.Style.STROKE);    // 只描边,不填充mProgPaint.setStrokeCap(Paint.Cap.ROUND);   // 设置圆角mProgPaint.setAntiAlias(true);              // 设置抗锯齿mProgPaint.setDither(true);                 // 设置抖动mProgPaint.setStrokeWidth(typedArray.getDimension(R.styleable.CircularProgressView_progWidth, 10));mProgPaint.setColor(typedArray.getColor(R.styleable.CircularProgressView_progColor, Color.BLUE));// 初始化进度圆环渐变色int startColor = typedArray.getColor(R.styleable.CircularProgressView_progStartColor, -1);int firstColor = typedArray.getColor(R.styleable.CircularProgressView_progFirstColor, -1);if (startColor != -1 && firstColor != -1) mColorArray = new int[]{startColor, firstColor};else mColorArray = null;// 初始化进度mProgress = typedArray.getInteger(R.styleable.CircularProgressView_progress, 0);typedArray.recycle();}@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {super.onMeasure(widthMeasureSpec, heightMeasureSpec);int viewWide = getMeasuredWidth() - getPaddingLeft() - getPaddingRight();int viewHigh = getMeasuredHeight() - getPaddingTop() - getPaddingBottom();int mRectLength = (int) ((viewWide > viewHigh ? viewHigh : viewWide) - (mBackPaint.getStrokeWidth() > mProgPaint.getStrokeWidth() ? mBackPaint.getStrokeWidth() : mProgPaint.getStrokeWidth()));int mRectL = getPaddingLeft() + (viewWide - mRectLength) / 2;int mRectT = getPaddingTop() + (viewHigh - mRectLength) / 2;mRectF = new RectF(mRectL, mRectT, mRectL + mRectLength, mRectT + mRectLength);// 设置进度圆环渐变色if (mColorArray != null && mColorArray.length > 1)mProgPaint.setShader(new LinearGradient(0, 0, 0, getMeasuredWidth(), mColorArray, null, Shader.TileMode.MIRROR));}@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);canvas.drawArc(mRectF, 0, 360, false, mBackPaint);canvas.drawArc(mRectF, 275, 360 * mProgress / 100, false, mProgPaint);}// ---------------------------------------------------------------------------------------------/*** 获取当前进度** @return 当前进度(0-100)*/public int getProgress() {return mProgress;}/*** 设置当前进度** @param progress 当前进度(0-100)*/public void setProgress(int progress) {this.mProgress = progress;invalidate();}/*** 设置当前进度,并展示进度动画。如果动画时间小于等于0,则不展示动画** @param progress 当前进度(0-100)* @param animTime 动画时间(毫秒)*/public void setProgress(int progress, long animTime) {if (animTime <= 0) setProgress(progress);else {ValueAnimator animator = ValueAnimator.ofInt(mProgress, progress);animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {@Overridepublic void onAnimationUpdate(ValueAnimator animation) {mProgress = (int) animation.getAnimatedValue();invalidate();}});animator.setInterpolator(new OvershootInterpolator());animator.setDuration(animTime);animator.start();}}/*** 设置背景圆环宽度** @param width 背景圆环宽度*/public void setBackWidth(int width) {mBackPaint.setStrokeWidth(width);invalidate();}/*** 设置背景圆环颜色** @param color 背景圆环颜色*/public void setBackColor(@ColorRes int color) {mBackPaint.setColor(ContextCompat.getColor(getContext(), color));invalidate();}/*** 设置进度圆环宽度** @param width 进度圆环宽度*/public void setProgWidth(int width) {mProgPaint.setStrokeWidth(width);invalidate();}/*** 设置进度圆环颜色** @param color 景圆环颜色*/public void setProgColor(@ColorRes int color) {mProgPaint.setColor(ContextCompat.getColor(getContext(), color));mProgPaint.setShader(null);invalidate();}/*** 设置进度圆环颜色(支持渐变色)** @param startColor 进度圆环开始颜色* @param firstColor 进度圆环结束颜色*/public void setProgColor(@ColorRes int startColor, @ColorRes int firstColor) {mColorArray = new int[]{ContextCompat.getColor(getContext(), startColor), ContextCompat.getColor(getContext(), firstColor)};mProgPaint.setShader(new LinearGradient(0, 0, 0, getMeasuredWidth(), mColorArray, null, Shader.TileMode.MIRROR));invalidate();}/*** 设置进度圆环颜色(支持渐变色)** @param colorArray 渐变色集合*/public void setProgColor(@ColorRes int[] colorArray) {if (colorArray == null || colorArray.length < 2) return;mColorArray = new int[colorArray.length];for (int index = 0; index < colorArray.length; index++)mColorArray[index] = ContextCompat.getColor(getContext(), colorArray[index]);mProgPaint.setShader(new LinearGradient(0, 0, 0, getMeasuredWidth(), mColorArray, null, Shader.TileMode.MIRROR));invalidate();}
}

res/vasues/attrs.xml

<?xml version="1.0" encoding="utf-8"?>
<resources><!--    圆形进度条--><declare-styleable name="CircularProgressView"><attr name="backWidth" format="dimension" />    <!--背景圆环宽度--><attr name="progWidth" format="dimension" />    <!--进度圆环宽度--><attr name="backColor" format="color" />        <!--背景圆环颜色--><attr name="progColor" format="color" />        <!--进度圆环颜色--><attr name="progStartColor" format="color" />   <!--进度圆环开始颜色--><attr name="progFirstColor" format="color" />   <!--进度圆环结束颜色--><attr name="progress" format="integer" />       <!--圆环进度--></declare-styleable>
</resources>
 <RelativeLayoutandroid:layout_width="wrap_content"android:layout_height="wrap_content"><com.example.demo.view.CircleProgressViewandroid:layout_width="85dp"android:layout_height="85dp"app:backWidth="20dp"内边框宽度app:progColor="#20AEFF"进度条颜色app:backColor="#E6DBDBDB"默认颜色app:progWidth="20dp"进度宽度app:progress="85" />进度值<TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_centerHorizontal="true"android:layout_centerVertical="true"android:text="85%"android:textColor="#ff4d4d4d"android:textSize="13sp" /></RelativeLayout>

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

uniapp圆形进度条

插件下载地址&#xff1a;https://ext-resource-aliyun.dcloud.net.cn/marketplace/206a8e50-63cb-11ec-8e77-a3fa77cd6ec0/1.1.2/plugin.zip?v1668747036 一、下载并解压&#xff0c;复制到uniapp的components下 二、使用 import导入组件 import circleProgressBar from /…

超简单的Android圆形进度条

效果图&#xff1a; 代码优化/简化、教科书级别注释、复制粘贴即可用 代码&#xff1a; package com.zistone.factorytest0718.view;import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; impor…

Android 绘制圆形进度条

Android 绘制圆形进度条 最近项目上有一些需求&#xff0c;需要绘制圆形的进度条满足设计上和交互上的需求&#xff1a; 实现思路 在画布上直接绘制View&#xff0c;需要了解一下几点 1.需要画一个圆 2.圆圈上有不同进度的颜色 3.圆圈中有进度数字的展示 4.圆圈中间还…

纯css制作圆形进度条

效果图大概是这样的 第一步 先定义出一个方形盒子 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>…

实现一个圆形进度条(vue)

实现方式&#xff1a;首先是用svg画两个圆&#xff0c;同圆心同半径的两个圆&#xff0c;然后把颜色都设置成透明&#xff0c;利用圆的边框来实现。给两个圆设置相同的边框宽度&#xff0c;并且设置颜色&#xff08;设置一个透明&#xff0c;一个有颜色&#xff09;&#xff1b…

药都银行冲刺上交所:年营收22.78亿 古井集团是股东

雷递网 雷建平 5月1日 亳州药都农村商业银行股份有限公司&#xff08;简称&#xff1a;“药都银行”&#xff09;日前递交招股书&#xff0c;准备在上交所主板上市。 药都银行计划募资16.38亿元。 年营收22.78亿 药都银行坐落于世界中医药之都——亳州市&#xff0c;于2005年12…

自贸港首家公务机公司海航金鹿商务正式启动运营

日前&#xff0c;海航集团旗下金鹿公务在海口设立公务机总部 -- 金鹿商务航空有限公司&#xff08;简称&#xff1a;金鹿商务&#xff09;&#xff0c;已通过中国民用航空海南安全监督管理局运行审定&#xff0c;取得中国民用航空中南地区管理局颁发的运行规范。4月29日上午9时…

内网通朋友不在线

前段时间使用内网通发现同学老师的总是不在线&#xff0c;有时候改一下IP地址&#xff0c;又可以&#xff0c;后面才发现原来可以自己设置网段地址的 设置过程见下图&#xff1a; 输入老师的IP地址的前三位即可

基于html5在线学生学籍信息管理系统

随着高校人数越来越多&#xff0c;管理高校的学生人数成为难题&#xff0c;如何更好的管理高校的入学人数&#xff1f;通过学籍的管理方式可以很好的将各年级&#xff0c;各个院校&#xff0c;各个专业的学生进行统一的管理&#xff0c;对不同的学生分门别类&#xff0c;学籍管…

爱班级电脑端下载|二维码签到

最近上网课发现爱班级的扫码功能只能在手机上进行&#xff0c;如果手动点到有时候还是会显示我没考勤&#xff0c;那有没有电脑端的爱班级下载呢&#xff1f;搜了很久发现是有的&#xff0c;但是要装个模拟器&#xff1a; 1.下载链接如下&#xff1a; 网盘链接&#xff1a; …

最新升学e网通JS逆向分析

目标网址:https://web.ewt360.com/ 重要说明:文章教程仅供参考学习,请勿用于非法用途,否则后果自负。 目录 1、接口参数分析 2、加密函数分析

2023年中国政务云行业发展概况及发展趋势分析:政务云由基础设施建设向云服务运营转变[图]

政务云是指运用云计算技术&#xff0c;统筹利用已有的机房、计算、存储、网络、安全、应用支撑、信息资源等&#xff0c;发挥云计算虚拟化、高可靠性、高通用性、高可扩展性及快速、按需、弹性服务等特征&#xff0c;为政府行业提供基础设施、支撑软件、应用系统、信息资源、运…

Java+Excel+POI+testNG基于数据驱动做一个简单的接口测试【杭州多测师_王sir】

一、创建一个apicases.xlsx放入到eclipse的resource里面&#xff0c;然后refresh刷新一下 二、在pom.xml文件中加入poi和testng的mvn repository、然后在eclipse的对应目录下放入features和plugins&#xff0c;重启eclipse就可以看到testNG了 <!--poi excel解析 --><d…

【Minecraft】Fabric Mod开发完整流程3 - 配方与挖掘等级

目录 新配方工作台配方无序合成配方有序合成配方 熔炉配方 挖掘等级与掉落物挖掘等级标准等级配置易错点分析 战利品与掉落物普通方块掉落物矿石方块掉落物 新配方 工作台配方 为便于你快速创建配方&#xff0c;可以直接去这个网站上通过拖拽的方式创建属于你的配方表&#xf…

V4L2-框架

1.概述 V4L2 是专门为linux 设备设计的一套视频框架&#xff0c;其主体框架在linux内核&#xff0c;可以理解为是整个linux系统上面的视频源捕获驱动框架。 相机驱动层位于HAL Moudle 与硬件层之间&#xff0c;借助linux 内核驱动框架&#xff0c;以文件节点的方式暴露接口给用…

vue2(2)

目录 天气案例 监视属性watch 深度监视 监视简写属性 watch对比computed 绑定class样式 条件渲染 列表渲染 天气案例 绑定事件的时候&#xff0c;xxx"yyy" yyy可以写一些简单的语句 <!DOCTYPE html> <html lang"en"> <head>…

积分代换和周期函数

昨晚上看书&#xff0c;有一个稳定随机过程的例题&#xff0c;涉及积分上下限代换、周期函数的微积分性质等知识点。这种题型以前肯定接触过&#xff0c;当下遇到了&#xff0c;思维仍然迷迷糊糊&#xff0c;像是一团乱麻&#xff0c;纠缠不清&#xff0c;照着答案思考了半天&a…

BOE(京东方)赋能荣耀Magic V2系列新品

7月12日&#xff0c;在荣耀举办的全场景新品发布会上&#xff0c;重磅推出了“革命性”折叠旗舰Magic V2系列以及首款MagicPad平板产品&#xff0c;荣耀Magic V2系列搭载BOE&#xff08;京东方&#xff09;全新一代柔性OLED折叠屏解决方案&#xff0c;以超强硬件护眼防护、超清…

开源数据库 就是免费 ,我白嫖我光荣 荣耀V2

开头还是介绍一下群&#xff0c;如果感兴趣polardb ,mongodb ,mysql ,postgresql ,redis 等有问题&#xff0c;有需求都可以加群群内有各大数据库行业大咖&#xff0c;CTO&#xff0c;可以解决你的问题。加群请联系 liuaustin3 &#xff0c;在新加的朋友会分到2群&#xff08;共…

荣耀Magic V2折叠旗舰发布,内外双屏均支持手写笔

7月12日&#xff0c;荣耀全新一代折叠旗舰荣耀Magic V2正式发布。通过深入洞察消费者需求&#xff0c;根植于强大的技术研发实力&#xff0c;荣耀以打破边界的思维创新重新定义折叠屏手机&#xff0c;荣耀MagicV2系列实现了9.9mm的闭合态厚度&#xff0c;引领折叠屏手机进入毫米…