/*** 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>

android实现圆形进度条相关推荐

  1. Android自定义圆形进度条

    Android自定义圆形进度条 github地址:https://github.com/opq1289/CircleProgressView 效果图: 无动画: 有动画: 整圆: 切割圆: 具体步骤: ...

  2. android自定义进度条百分比跟着走,Android studio圆形进度条 百分数跟随变化

    本文实例为大家分享了Android studio圆形进度条展示的具体代码,供大家参考,具体内容如下 MainActivity import android.support.v7.app.AppComp ...

  3. Android 绘制圆形进度条

    Android 绘制圆形进度条 最近项目上有一些需求,需要绘制圆形的进度条满足设计上和交互上的需求: 实现思路 在画布上直接绘制View,需要了解一下几点 1.需要画一个圆 2.圆圈上有不同进度的颜色 ...

  4. Android可触摸圆形进度条,Android 可滚动圆形进度条 滑块和进度在进度条上面跟着滚动...

    Android 可滚动圆形进度条 滑块和进度在进度条上面跟着滚动.package com.example.test; import android.content.Context; import an ...

  5. android自定义圆形进度条,实现动态画圆效果

    自定义圆形进度条效果图如下:应用场景如动态显示分数等. view的自定义属性如下attr.xml <?xml version="1.0" encoding="UTF ...

  6. android 渐变圆形进度条_flutter好用的轮子推荐七-flutter圆形或线型进度条

    前言 Flutter是谷歌的移动UI框架,可以快速在iOS和Android上构建高质量的原生用户界面. IT界著名的尼古拉斯·高尔包曾说:轮子是IT进步的阶梯!热门的框架千篇一律,好用轮子万里挑一!F ...

  7. Android 自定义圆形进度条(圆环刻度)View

    转载请注明出处http://blog.csdn.net/shallcheek/article/details/50343677 这个也刚好是公司软件最近的需求需要到的,当初最早的版本是使用美工切好的图 ...

  8. android 自定义圆形进度条拖动样式,android自定义圆形进度条

    首先在布局文件定义Progressbar xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tool ...

  9. Android 之 ProgressDialog用法介绍(矩形进度条 和 圆形 进度条)

    2019独角兽企业重金招聘Python工程师标准>>> 布局文件: <LinearLayout xmlns:android="http://schemas.andro ...

最新文章

  1. mysql并发更新数据,多用户并发修改数据解决方案。
  2. 适合初学者学java技术的书籍推荐!
  3. R语言基于线性回归(Linear Regression)进行特征筛选(feature selection)
  4. 使用 AngularJS NodeJS 实现基于token 的认证应用(转)
  5. *** 隧道和加密技术知识要点
  6. Python SQLAlchemy入门教程
  7. 2020年11月全国程序员工资,新出炉!
  8. STM32工作笔记004---了解高速版PCB设计Cadence
  9. 多元统计分析朱建平pdf_应用多元统计分析课后答案朱建平版[精心整理].doc
  10. windbg调试C#代码(二)
  11. NameNode DataNode
  12. 带常数项指数函数的非线性回归方法(python实现)
  13. Python操作excel基础
  14. 倒角距离(Chamfer distance)
  15. 寒假水67——空心三角形
  16. 俄亥俄州立大学计算机专业排名,俄亥俄州立大学CS专业排名2020年
  17. 计算机主机的cpu作用,cpu的作用是什么?cpu的主要功能详解
  18. PMP考试涉及的计算题
  19. 第十六章 时间序列数据分析基本概念
  20. 前端基础--JavaScript

热门文章

  1. 如何构建一个可以盈利的量化交易模型
  2. 删除文件的非递归算法
  3. [机器学习笔记] (四)决策树 Decision Tree
  4. 使用ECharts map,实现省、市、区县、乡镇自定义地图
  5. 一个屌丝程序猿的人生(五十六)
  6. vb程序设计题(新)
  7. Xshell许可证过期的解决方法,非常有用
  8. 英语的原理∶用美国人的思维学英语
  9. 算法导论第四章4.1-5 dp解法
  10. 长内容生成pdf 防止内容pdf分页隔断