package com.example.firstapp;

import java.text.DecimalFormat;

import android.annotation.SuppressLint;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Paint.FontMetrics;
import android.graphics.RectF;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View; /**
* 自定义圆形进度条思路
*
* 1.先画外圆,再画弧度,
* 2.然后在画内圆
* 3.画文本信息
* 形成一个叠加的效果
*/
public class MyProgressBar extends View {
private FontMetrics fm;
private Paint paint;
/**内圆半径*/
private int inRadius;
/**外圆半径*/
private int outRadius;
/**文字的颜色*/
private int textColor=Color.rgb(20,131,214);
/**内圆的颜色*/
private int inRdColor=Color.WHITE;
/**外圆的颜色*/
private int outRdColor=Color.LTGRAY;
/**进度条的颜色*/
private int proColor=Color.rgb(20,131,214);
/**进度的最大值*/
private int max;
/**当前进度条的值*/
private int progress;
/**文字的大小*/
private int textSize=50; public MyProgressBar(Context context, AttributeSet attrs) {
super(context, attrs);
init();
} private void init() {
paint = new Paint();
} /***
* 设置内圆的半径
*
* @param radius
*/
public void setInRadius(int radius) {
this.inRadius = radius;
} /***
* 设置外圆的半径
*
* @param radius
*/
public void setOutRadius(int radius) {
this.outRadius = radius;
} /**
* 设置进度条的颜色 默认蓝色
*
* @param color
*/
public void setColor(int color) {
this.textColor=color;
} /***
* 设置文字的颜色值 默认蓝色
*
* @param color
*/
public void setTextColor(int color) {
this.textColor=color;
} /***
* 设置进度条的最大值
* @param max
*/
public void setMax(int max) {
this.max = max;
} /***
* 设置当前进度条的进度值
* @param progress
*/
public void setProgress(int progress) {
this.progress=progress;
//设置进度之后,要求UI强制进行重绘
postInvalidate();
} /**
* 设置文字的大小
* @param size
*/
public void setTextSize(int size){
this.textSize=size;
} @SuppressLint("DrawAllocation")
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
// 获取控件的中心点
int cx = getWidth() / 2;
int cy = getHeight() / 2; /***
* 1.画外圆
*/
paint.setAntiAlias(true);// 设置画笔抗锯齿效果
paint.setColor(this.outRdColor);
canvas.drawCircle(cx, cy, this.outRadius, paint); /***
* 2.画弧度
*/
paint.setColor(this.proColor);
// paint.setARGB(0, 25, 63, 155);
// 圆形进度条的宽度就是外圆的半径减去内圆的半径
paint.setStrokeWidth(outRadius - inRadius);
paint.setStyle(Paint.Style.STROKE);//设置弧度外填充 /**
* 用于定义的圆弧的形状和大小的界限, 界限的计算:就是以外圆的正切圆的方式计算出,左上,右下的坐标值
* 有了中心点的坐标值cx,cy,也有了半径r那么
*
* left=cx-外圆的半径
* top=cy-外圆的半径
* right=cx+外圆的半径
* bottom=cy+外圆的半径
*
* 但这里要考虑一个问题是画笔有他本身的宽度,根据上面的思路把画笔的宽度问题,重新计算出圆弧的范围
*/ int middle = (int) (paint.getStrokeWidth() / 2);
RectF oval = new RectF(cx - outRadius + middle, cy - outRadius + middle, cx + outRadius - middle, cy
+ outRadius - middle);
canvas.drawArc(oval, 0, 360 * this.progress / this.max, false, paint); // 根据进度画圆弧 /***
* 3.画内圆
*/
paint.setStyle(Paint.Style.FILL);
paint.setColor(this.inRdColor);
canvas.drawCircle(cx, cy, this.inRadius, paint); /***
*4. 绘制文本
*/
paint.setColor(this.textColor);
paint.setStrokeWidth(5);
paint.setTextSize(this.textSize);
fm = paint.getFontMetrics(); //保留两位小数
DecimalFormat df = new DecimalFormat("#.00");
String numText=df.format(this.progress*1.0/max*100);
// 测量文本的宽度
float textWidth = paint.measureText(numText) / 2;
Log.d("progress", progress+"");
float textCenterVerticalBaselineY = getHeight() / 2 - fm.descent + (fm.descent - fm.ascent) / 2; canvas.drawText(numText, cx - textWidth, textCenterVerticalBaselineY, paint);
} }


  

自定义VIew——漂亮的圆形进度条的更多相关文章

  1. Android 自定义漂亮的圆形进度条

    公司有这样一个需求,实现这个圆弧进度条 所以,现在就将它抽取出来分享 如果需要是圆帽的就将,下面这句代码放开即可 mRingPaint.setStrokeCap(Paint.Cap.ROUND);// ...

  2. 自定义View实现钟摆效果进度条PendulumView

    转载请注明出处:http://blog.csdn.net/fightlei/article/details/52556755 在网上看到了一个IOS组件PendulumView,实现了钟摆的动画效果. ...

  3. 自定义view的drawRoundRect模拟进度条

    主要方法发介绍 1:drawRoundRect参数介绍 drawRoundRect(l,t,r,b,rx,ry,paint)里面的参数可以有两种: 1:前四个参数(l,t,r,,b)分别是矩形左边距离 ...

  4. Android 高手进阶之自定义View,自定义属性(带进度的圆形进度条)

      Android 高手进阶(21)  版权声明:本文为博主原创文章,未经博主允许不得转载. 转载请注明地址:http://blog.csdn.net/xiaanming/article/detail ...

  5. Android 自定义 View 圆形进度条总结

    Android 自定义圆形进度条总结 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 微信公众号:牙锅子 源码:CircleProgress 文中如有纰漏,欢迎大家留言指出. 最近 ...

  6. 【Android 应用开发】 自定义 圆形进度条 组件

    转载著名出处 : http://blog.csdn.net/shulianghan/article/details/40351487 代码下载 : -- CSDN 下载地址 : http://down ...

  7. android 自定义图片圆形进度条

    感觉话一个圆形进度条挺简单的 ,但是却偏偏给了几张图片让你话,说实话我没接触过,感觉好难,还好百度有大把的资源,一番努力下终于画出来了. 代码如下. package com.etong.cpms.wi ...

  8. Android 带进度的圆形进度条

    最近项目有个需求,做带进度从下到上的圆形进度条. 网上查了一下资料,发现这篇博客写得不错http://blog.csdn.net/xiaanming/article/details/10298163 ...

  9. Android 高手进阶,自己定义圆形进度条

    背景介绍 在Android 开发中,我们常常遇到各种各样绚丽的控件,所以,依靠我们Android本身所带的控件是远远不够的,许多时候须要我们自定义控件,在开发的过程中.我们公司遇到了一种须要自己写的一 ...

随机推荐

  1. iOS 如何优雅的处理“回调地狱Callback hell”(一) (上)

    前言 最近看了一些Swift关于封装异步操作过程的文章,比如RxSwift,RAC等等,因为回调地狱我自己也写过,很有感触,于是就翻出了Promise来研究学习一下.现将自己的一些收获分享一下,有错误 ...

  2. Python开发【第七篇】:面向对象 和 python面向对象进阶篇(下)

    Python开发[第七篇]:面向对象   详见:<Python之路[第五篇]:面向对象及相关> python 面向对象(进阶篇)   上一篇<Python 面向对象(初级篇)> ...

  3. Java中的浅复制和深复制 Cloneable clone

    先看一个简单案例 public class Test {     public static void main(String args[]) {         Student stu1 = new ...

  4. call, apply, bind作用

    call, apply作用就是(改变方法中的this指向)借用别人的方法来调用,就像调用自己的一样 function Person(name) { this.name = name; } Person ...

  5. (转)C#文件操作

    原文连接:http://www.cnblogs.com/wangshenhe/archive/2012/05/09/2490438.html 文件与文件夹操作主要用到以下几个类: 1.File类: 提 ...

  6. SQL利用临时表实现动态列、动态添加列

    --方法一--------------------------------------------------------------------- declare @sql as varchar(1 ...

  7. SVN 不能提交, 看不到日志, 出现乱码. 解决方案.

    需要工具 sprite3: 点这里下载. 解决问题 如本文标题所写. 我遇到过几次一样的问题, 每次都很蛋疼的把目录重新检出, 浪费时间, 又伤了脾气. 下面是我在百度经验找到的一片帖子, 效果杠杠的 ...

  8. 0.0C语言重点问题回顾

    左值和右值得区别:左值是用来表明变量的身份的,右值更加侧重于值本身: void*是个例外,它只有基地址没有类型信息,所以无法解引用. int *p = malloc(100); char *s = m ...

  9. 如何使用LoadRunner监控Windows

    1.监视连接前的准备工作   1)进入被监视windows系统,开启以下二个服务Remote Procedure Call(RPC) 和Remote Registry Service (开始—)运行 ...

  10. asp.net Server.HtmlEncode和HtmlDecode

    <html xmlns="http://www.w3.org/1999/xhtml"><head runat="server">< ...