说明:

分析了一个git项目:https://github.com/youmu178/ArcProgressBar

效果图:

关键代码:

调用MainActivity.java

mArcProgressBar = (ArcProgressBar) findViewById(R.id.arcProgressBar);//重置Button btRestart = (Button) findViewById(R.id.button);btRestart.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {mArcProgressBar.restart();}});//开始Button btStart = (Button) findViewById(R.id.button2);btStart.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {ValueAnimator valueAnimator =ValueAnimator.ofInt(0, 100);valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {@Overridepublic void onAnimationUpdate(ValueAnimator animation) {mArcProgressBar.setProgress((int) animation.getAnimatedValue());}});valueAnimator.addListener(new AnimatorListenerAdapter() {@Overridepublic void onAnimationEnd(Animator animation) {super.onAnimationEnd(animation);mArcProgressBar.setProgressDesc("已售罄");}});valueAnimator.setDuration(5000);valueAnimator.start();}});

布局引用activity_main.xml

<com.youzh.ArcProgressBarandroid:id="@+id/arcProgressBar"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_centerInParent="true"/>

自定义布局ArcProgressBar.java

package com.youzh;import android.content.Context;
import android.content.res.Resources;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.RectF;
import android.text.TextUtils;
import android.util.AttributeSet;
import android.util.DisplayMetrics;
import android.view.View;
import android.view.WindowManager;/*** Created by youzehong on 16/4/19.*/
public class ArcProgressBar extends View {private Paint mArcPaint;private Paint mTextPaint;private Paint mDottedLinePaint;private Paint mRonudRectPaint;private Paint mProgressPaint;private RectF mRountRect;private RectF mArcRect;/*** 圆弧宽度*/private float mArcWidth = 20.0f;/*** 圆弧颜色*/private int mArcBgColor = 0xFFFF916D;/*** 虚线默认颜色*/private int mDottedDefaultColor = 0xFF8D99A1;/*** 虚线变动颜色*/private int mDottedRunColor = 0xFFf0724f;/*** 圆弧两边的距离*/private int mPdDistance = 50;/*** 底部默认文字*/private String mArcText= "";/*** 线条数*/private int mDottedLineCount = 100;/*** 线条宽度*/private int mDottedLineWidth = 40;/*** 线条高度*/private int mDottedLineHeight = 6;/*** 圆弧跟虚线之间的距离*/private int mLineDistance = 20;/*** 进度条最大值*/private int mProgressMax = 100;/*** 进度文字大小*/private int mProgressTextSize = 65;/*** 进度描述*/private String mProgressDesc;private int mScressWidth;private int mProgress;private float mExternalDottedLineRadius;private float mInsideDottedLineRadius;private int mArcCenterX;private int mArcRadius; // 圆弧半径private double bDistance;private double aDistance;private boolean isRestart = false;private int mRealProgress;public ArcProgressBar(Context context) {this(context, null, 0);}public ArcProgressBar(Context context, AttributeSet attrs) {this(context, attrs, 0);}public ArcProgressBar(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);intiAttributes(context, attrs);initView();}private void intiAttributes(Context context, AttributeSet attrs) {TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.ArcProgressBar);mPdDistance = a.getInteger(R.styleable.ArcProgressBar_arcDistance, mPdDistance);mArcBgColor = a.getColor(R.styleable.ArcProgressBar_arcBgColor, mArcBgColor);mDottedDefaultColor = a.getColor(R.styleable.ArcProgressBar_dottedDefaultColor, mDottedDefaultColor);mDottedRunColor = a.getColor(R.styleable.ArcProgressBar_dottedRunColor, mDottedRunColor);mDottedLineCount = a.getInteger(R.styleable.ArcProgressBar_dottedLineCount, mDottedLineCount);mDottedLineWidth = a.getInteger(R.styleable.ArcProgressBar_dottedLineWidth, mDottedLineWidth);mDottedLineHeight = a.getInteger(R.styleable.ArcProgressBar_dottedLineHeight, mDottedLineHeight);mLineDistance = a.getInteger(R.styleable.ArcProgressBar_lineDistance, mLineDistance);mProgressMax = a.getInteger(R.styleable.ArcProgressBar_progressMax, mProgressMax);mProgressTextSize = a.getInteger(R.styleable.ArcProgressBar_progressTextSize, mProgressTextSize);mProgressDesc = a.getString(R.styleable.ArcProgressBar_progressDesc);mArcText = a.getString(R.styleable.ArcProgressBar_arcText);if (TextUtils.isEmpty(mArcText)) {mArcText= "限时特卖";}a.recycle();}private void initView() {int[] screenWH = getScreenWH();mScressWidth = screenWH[0];// 外层圆弧的画笔mArcPaint = new Paint();mArcPaint.setAntiAlias(true);mArcPaint.setStyle(Paint.Style.STROKE);mArcPaint.setStrokeWidth(mArcWidth);mArcPaint.setColor(mArcBgColor);mArcPaint.setStrokeCap(Paint.Cap.ROUND);//mTextPaint = new Paint();mTextPaint.setAntiAlias(true);mTextPaint.setTextSize(dp2px(getResources(), 16));mTextPaint.setColor(Color.WHITE);// 内测虚线的画笔mDottedLinePaint = new Paint();mDottedLinePaint.setAntiAlias(true);mDottedLinePaint.setStrokeWidth(mDottedLineHeight);mDottedLinePaint.setColor(mDottedDefaultColor);//mRonudRectPaint = new Paint();mRonudRectPaint.setAntiAlias(true);mRonudRectPaint.setColor(mDottedRunColor);mRonudRectPaint.setStyle(Paint.Style.FILL);// 中间进度画笔mProgressPaint = new Paint();mProgressPaint.setAntiAlias(true);mProgressPaint.setColor(mDottedRunColor);mProgressPaint.setTextSize(dp2px(getResources(), mProgressTextSize));}@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {super.onMeasure(widthMeasureSpec, heightMeasureSpec);int width = mScressWidth - 2 * mPdDistance;setMeasuredDimension(width, width);}@Overrideprotected void onSizeChanged(int w, int h, int oldw, int oldh) {super.onSizeChanged(w, h, oldw, oldh);mArcCenterX = (int) (w / 2.f);mArcRect = new RectF();mArcRect.top = 0;mArcRect.left = 0;mArcRect.right = w;mArcRect.bottom = h;mArcRect.inset(mArcWidth / 2, mArcWidth / 2);mArcRadius = (int) (mArcRect.width() / 2);double sqrt = Math.sqrt(mArcRadius * mArcRadius + mArcRadius * mArcRadius);bDistance = Math.cos(Math.PI * 45 / 180) * mArcRadius;aDistance = Math.sin(Math.PI * 45 / 180) * mArcRadius;// 内部虚线的外部半径mExternalDottedLineRadius = mArcRadius - mArcWidth / 2 - mLineDistance;// 内部虚线的内部半径mInsideDottedLineRadius = mExternalDottedLineRadius - mDottedLineWidth;mRountRect = new RectF();mRountRect.left = (float) (2 * mArcCenterX - 2 * aDistance) / 2 - mArcWidth / 2 + 40;mRountRect.top = (float) (mArcCenterX + bDistance) - 20;mRountRect.right = (float) (2 * mArcCenterX - (2 * mArcCenterX - 2 * aDistance) / 2) - mArcWidth / 2 - 40;mRountRect.bottom = (float) (mArcRadius + mArcRadius) - 20;}@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);canvas.drawArc(mArcRect, 135, 270, false, mArcPaint);canvas.drawRoundRect(mRountRect, 100, 100, mRonudRectPaint);canvas.drawText(mArcText, mArcRadius - mTextPaint.measureText(mArcText) / 2,(float) (mArcRadius + bDistance) - 2 * (mTextPaint.descent() + mTextPaint.ascent()), mTextPaint);
//        Log.i(TAG, (float) (mArcRadius + bDistance) - 2 * (mTextPaint.descent() + mTextPaint.ascent()) + "");drawDottedLineArc(canvas);drawRunDottedLineArc(canvas);drawRunText(canvas);if (isRestart) {drawDottedLineArc(canvas);}}private void drawRunText(Canvas canvas) {String progressStr = this.mRealProgress + "%";if (!TextUtils.isEmpty(mProgressDesc)) {progressStr = mProgressDesc;}canvas.drawText(progressStr, mArcCenterX - mProgressPaint.measureText(progressStr) / 2,mArcCenterX - (mProgressPaint.descent() + mProgressPaint.ascent()) / 2 - 20, mProgressPaint);}public void restart() {isRestart = true;this.mRealProgress = 0;this.mProgressDesc = "";invalidate();}/*** 设置中间进度描述** @param desc*/public void setProgressDesc(String desc) {this.mProgressDesc = desc;postInvalidate();}/*** 设置最大进度** @param max*/public void setMaxProgress(int max) {this.mProgressMax = max;}/*** 设置当前进度** @param progress*/public void setProgress(int progress) {// 进度100% = 控件的75%this.mRealProgress = progress;isRestart = false;this.mProgress = ((mDottedLineCount * 3 / 4) * progress) / mProgressMax;postInvalidate();}private void drawRunDottedLineArc(Canvas canvas) {mDottedLinePaint.setColor(mDottedRunColor);float evenryDegrees = (float) (2.0f * Math.PI / mDottedLineCount);float startDegress = (float) (225 * Math.PI / 180) + evenryDegrees / 2;for (int i = 0; i < mProgress; i++) {float degrees = i * evenryDegrees + startDegress;float startX = mArcCenterX + (float) Math.sin(degrees) * mInsideDottedLineRadius;float startY = mArcCenterX - (float) Math.cos(degrees) * mInsideDottedLineRadius;float stopX = mArcCenterX + (float) Math.sin(degrees) * mExternalDottedLineRadius;float stopY = mArcCenterX - (float) Math.cos(degrees) * mExternalDottedLineRadius;canvas.drawLine(startX, startY, stopX, stopY, mDottedLinePaint);}}private void drawDottedLineArc(Canvas canvas) {mDottedLinePaint.setColor(mDottedDefaultColor);// 360 * Math.PI / 180float evenryDegrees = (float) (2.0f * Math.PI / mDottedLineCount);float startDegress = (float) (135 * Math.PI / 180);float endDegress = (float) (225 * Math.PI / 180);for (int i = 0; i < mDottedLineCount; i++) {float degrees = i * evenryDegrees;// 过滤底部90度的弧长if (degrees > startDegress && degrees < endDegress) {continue;}float startX = mArcCenterX + (float) Math.sin(degrees) * mInsideDottedLineRadius;float startY = mArcCenterX - (float) Math.cos(degrees) * mInsideDottedLineRadius;float stopX = mArcCenterX + (float) Math.sin(degrees) * mExternalDottedLineRadius;float stopY = mArcCenterX - (float) Math.cos(degrees) * mExternalDottedLineRadius;canvas.drawLine(startX, startY, stopX, stopY, mDottedLinePaint);}}private int[] getScreenWH() {WindowManager windowManager = (WindowManager) getContext().getSystemService(Context.WINDOW_SERVICE);DisplayMetrics displayMetrics = new DisplayMetrics();windowManager.getDefaultDisplay().getMetrics(displayMetrics);int[] wh = {displayMetrics.widthPixels, displayMetrics.heightPixels};return wh;}private float dp2px(Resources resources, float dp) {final float scale = resources.getDisplayMetrics().density;return dp * scale + 0.5f;}
}

attrs.xml

<?xml version="1.0" encoding="utf-8"?>
<resources><declare-styleable name="ArcProgressBar"><attr name="arcDistance" format="integer"/><attr name="arcBgColor" format="color"/><attr name="dottedDefaultColor" format="color"/><attr name="dottedRunColor" format="color"/><attr name="dottedLineCount" format="integer"/><attr name="dottedLineWidth" format="integer"/><attr name="dottedLineHeight" format="integer"/><attr name="lineDistance" format="integer"/><attr name="progressMax" format="integer"/><attr name="progressTextSize" format="integer"/><attr name="progressDesc" format="string"/><attr name="arcText" format="string"/></declare-styleable>
</resources>

运行上面代码即可出效果。

Android圆形进度条动画相关推荐

  1. java进度条动画_Android自定义控件之圆形进度条动画

    本文实例为大家分享了Android实现圆形进度条动画的具体代码,供大家参考,具体内容如下 首先贴上图片: 额,感觉还行吧,就是进度条的颜色丑了点,不过咱是程序员,不是美工,配色这种问题当然不在考虑范围 ...

  2. html进度条圆圈渐变色,HTML5 canvas带渐变色的圆形进度条动画

    jquery-circle-progress是一款带渐变色的圆形进度条动画特效jQuery插件.该圆形进度条使用的是HTML5 canvas来绘制圆形进度条及其动画效果,进度条使用渐变色来填充,效果非 ...

  3. html5圆形提交按钮样式,HTML5 SVG带圆形进度条动画的提交按钮特效

    这是一款非常实用的HTML5 SVG带圆形进度条动画的提交按钮特效.该提交按钮在被点击之后,按钮变形为一个圆形的进度条,当进度条运行一周之后,可以设置提交成功和提交失败的两种按钮状态. 制作方法 HT ...

  4. android椭圆进度,Android 圆形进度条

    可设置 线性渐变-背景色-进度条颜色-圆弧宽度 效果图 普通效果.png 渐变效果 改变弧度效果 步骤一:新建自定义控件CirclePercentView继承View(代码可直接复制使用) impor ...

  5. 基于CAShapeLayer和贝塞尔曲线的圆形进度条动画

    通过CAShapeLayer和贝塞尔曲线搭配的方法,创建的简单的圆形进度条的教程 先简单的介绍下CAShapeLayer 1,CAShapeLayer继承自CALayer,可使用CALayer的所有属 ...

  6. android 圆形拖动条,Android圆形进度条自定义

    自定义圆形进度条 示例.png 示例 (2).png 示例 (3).png 示例 (4).png 实现 override fun onSizeChanged(w: Int, h: Int, oldw: ...

  7. 微信小程序 环形进度条_微信小程序实现圆形进度条动画

    本文实例为大家分享了微信小程序动画之圆形进度条,供大家参考,具体内容如下 上图: 代码: js: //获取应用实例 var app = getApp() var interval; var varNa ...

  8. 超简单的Android圆形进度条

    效果图: 代码优化/简化.教科书级别注释.复制粘贴即可用 代码: package com.zistone.factorytest0718.view;import android.content.Con ...

  9. android圆形进度条

    一.简介 1.本篇博文给大家介绍一个圆形进度条控件的绘制,首先看一下效果,如下:当点击圆形按钮时,开始加载条,当松开时,进度条回归其实位置: 二.结构分析 为了达到以上效果,我们首先要清楚改控件的结构 ...

最新文章

  1. java程序无法启动_由于Java程序,Tomcat无法启动
  2. js之浅拷贝和深拷贝
  3. SPOJ MULTQ3 7299 Multiples of 3 (区间更新)
  4. 细说PHP中strlen和mb_strlen的区别
  5. MFC动态链接库的制作步骤和使用方法
  6. java 面试什么是类_Java 面试题代码类收集
  7. java蓝桥杯省赛第十届_2019年第十届蓝桥杯省赛-迷宫(BFS/Excel大法)
  8. DB2数据库对象设计
  9. VTN系列多通道振弦模拟信号采集仪常规操作
  10. 闲鱼数据采集学习研究
  11. 数据集voc,coco注释格式,详情大全
  12. 智能停车场车牌识别计费系统
  13. 阵列信号DOA估计系列(一).概述
  14. [SDOI2012]拯救小云公主
  15. ap计算机sql,如何用sql实现AP
  16. 产品管理之创新商业模式
  17. 可怕!简直了! 无人机竟然“操控”了机场!
  18. python的运算符号使等式成立_那些年被我坑过的Python——不得不知(第二章)
  19. 江苏计算机专业的学校排名2015,2015关于江苏省高校排名「最新」
  20. 范成法加工matlab_基于Matlab的渐开线齿轮的范成法仿真.doc

热门文章

  1. 【安全知识分享】安全生产月活动总结课件(附下载)
  2. delphi中ListView拖曳效果实现
  3. android 波斯文排序,Android 4.2原生支持从右到左的文字排列格式
  4. 计算机专业答辩需要演示系统么,计算机毕业论文答辩过程及要求
  5. 【卷积神经网络】CNN发展史
  6. 越狱[P.B.]第三季(共22集)
  7. 一分钟就能让你了解NLP!
  8. Kinect_姿势识别
  9. 非常好用的分页对象PageInfo
  10. 用计算机算方程近似值,借助CASIO图形计算器探索方程近似解的求解