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. zabbix图中出现中文乱码问题

    我这周部署了zabbix监控服务器,但是配置过程中发现当有中文时,图中的中文会变成方块 如下图所示: 这个问题是由于zabbix的web端没有中文字库,我们最需要把中文字库加上即可 解决办法如下 1. ...

  2. RxJava 教程-1 简介 原理 线程控制 变换

    简介 RxJava 是什么? RxJava 在 GitHub 主页上的自我介绍是 RxJava is a Java VM implementation of ReactiveX: a library ...

  3. Memento 备忘录 快照模式

    简介 定义: 在不破坏封装的前提下,捕获一个对象的[内部状态],并在该对象之外保存这个状态,这样以后就可以将该对象恢复到原先保存的状态. 角色: 发起人Originator:要被备份的成员,它提供一创 ...

  4. VB几种函数参数传递方法,Variant,数组,Optional,ParamArray

    VB几种函数参数传递方法,Variant,数组,Optional,ParamArray 一) 过程的参数被缺省为具有 Variant 数据类型. 1)ByRef按 地址传递参数在 VB 中是缺省的 按 ...

  5. ACM比赛技巧

    一.语言是最重要的基本功   无论侧重于什么方面,只要是通过计算机程序去最终实现的竞赛,语言都是大家要过的第一道关.亚洲赛区的比赛支持的语言包括C/C++与JAVA.笔者首先说说JAVA,众所周知,作 ...

  6. readonly 与 const

    readonly MSDN定义:readonly 关键字是可以在字段上使用的修饰符.当字段声明包括 readonly 修饰符时,该声明引入的字段赋值只能作为声明的一部分出现,或者出现在同一类的构造函数 ...

  7. [JS] 如何清空file input框 [整理]

    测试环境:OS --> winXPBrowsers --> IE6+, FF 3.0.11, FF 3.5, Opera 9.64, Opera 10 beta 2, Safari 4, ...

  8. 关于线程池ThreadPool的学习

    学习重点ThreadPool.SetMinThreads(out workerThreads, out completionPortThreads).这是整个线程池的关键.  而ThreadPool. ...

  9. zookeeper集群一次性启动

    编写shell脚本 新建文本,命名为start-zookeeper.sh #!/bin/sh echo "start zkServer…" for i in master work ...

  10. 【windows开发实现记事本程序——逻辑篇1】

    1. 主要内容 从本节开始介绍windows开发实现记事本程序的逻辑实现部分.本节的主要内容有以下3点: 1. 主窗口定义  -- 主要介绍记事本主界面窗口对应的窗口类及实现方案 2. RichEdi ...