源代码及可执行文件下载地址:http://files.cnblogs.com/rainboy2010/ProgressChart.zip

因项目需要,自己尝试定义了一个进度环,用于显示进度,实现效果如下:

主要代码如下:

public class ProgressChart extends View
{ private Context context; //圆环背景画笔
private Paint paintBg; //圆环进度画笔
private Paint paintProgress; //文字画笔1
private Paint paintText1; //文字画笔2
private Paint paintText2; // 圆环的宽度
private float progressWidth; //圆环的区域
private RectF roundRect; //文字的区域
private Rect textRect; //单个字符的区域
private Rect charRect; //绘制时每次增加的度数
private float rotateDegree = 1.0F; //绘制开始的度数
private float startDegree = 0.0F; //结束的度数
private float endDegree; //背景颜色
private int bgColor; //进度颜色
private int progressColor; // 中间进度百分比的字符串的颜色
private int textColor; //字符串的文字大小
private float text1Size; //字符串的文字大小
private float text2Size; //绘制的字符串
private String text="0%"; public ProgressChart(Context context)
{
this(context, null);
} public ProgressChart(Context context, AttributeSet attrs)
{
this(context, attrs, 0);
} public ProgressChart(Context context, AttributeSet attrs,int defStyleAttr)
{
super(context, attrs, defStyleAttr); this.context=context; init(attrs);
} private void init(AttributeSet attrs)
{
TypedArray mTypedArray = context.obtainStyledAttributes(attrs,R.styleable.ProgressChart); this.progressWidth = mTypedArray.getDimension(R.styleable.ProgressChart_progressWidth, 8);
this.text1Size = mTypedArray.getDimension(R.styleable.ProgressChart_textSize1, 32);
this.text2Size = mTypedArray.getDimension(R.styleable.ProgressChart_textSize2, 20);
this.bgColor = mTypedArray.getColor(R.styleable.ProgressChart_bgColor,Color.parseColor("#fff2f2f2"));
this.progressColor = mTypedArray.getColor(R.styleable.ProgressChart_progressColor,Color.parseColor("#fffd0000"));
this.textColor = mTypedArray.getColor(R.styleable.ProgressChart_txtColor,Color.parseColor("#fffd0000")); mTypedArray.recycle(); this.textRect = new Rect();
this.charRect = new Rect(); this.paintBg = new Paint();
this.paintBg.setStyle(Paint.Style.STROKE);
this.paintBg.setStrokeWidth(this.progressWidth);
this.paintBg.setColor(this.bgColor); this.paintProgress = new Paint();
this.paintProgress.setStyle(Paint.Style.STROKE);
this.paintProgress.setStrokeWidth(this.progressWidth);
this.paintProgress.setColor(this.progressColor); this.paintText1 = new Paint();
this.paintText1.setTextSize(this.text1Size);
this.paintText1.setTextAlign(Paint.Align.CENTER);
this.paintText1.setColor(this.textColor); this.paintText2 = new Paint();
this.paintText2.setTextSize(this.text2Size);
this.paintText2.setTextAlign(Paint.Align.CENTER);
this.paintText2.setColor(this.textColor);
} public boolean setProgress(String progress)
{
this.text = DecimalFormat.getPercentInstance().format(Double.valueOf(progress));
this.startDegree = 0.0F;
this.endDegree = (360.0F * Float.valueOf(progress).floatValue());
this.rotateDegree = (this.endDegree / 40.0F); invalidate(); return true;
} @Override
protected void onDraw(Canvas canvas)
{
//绘制圆环背景
canvas.drawArc(this.roundRect, 0.0F, 360.0F, false, this.paintBg); //绘制进度
if (this.startDegree < this.endDegree)
{
canvas.drawArc(this.roundRect, -90.0F, this.startDegree, false, this.paintProgress);
this.startDegree += this.rotateDegree;
invalidate();
}
else
{
canvas.drawArc(this.roundRect, -90.0F, this.endDegree, false, this.paintProgress);
} if(!TextUtils.isEmpty(this.text))
{
//绘制文字
this.paintText1.getTextBounds(this.text, 0, this.text.length(), this.textRect);
this.paintText2.getTextBounds("%", 0, 1, this.charRect); FontMetricsInt fontMetricsInt = this.paintText1.getFontMetricsInt();
float y = this.roundRect.top + (this.roundRect.bottom - this.roundRect.top - fontMetricsInt.bottom + fontMetricsInt.top) / 2.0F - 5 * fontMetricsInt.top / 5;
canvas.drawText(this.text.replace("%", ""), this.roundRect.centerX() - this.charRect.width() / 2, y, this.paintText1);
canvas.drawText("%", this.roundRect.centerX() + this.textRect.width() / 2 - this.charRect.width() / 2, y, this.paintText2);
}
} @Override
protected void onSizeChanged(int w, int h, int oldw, int oldh)
{
this.roundRect = new RectF(this.progressWidth, this.progressWidth, w - this.progressWidth, h - this.progressWidth);
} }

Android一个自定义的进度环:ProgressChart的更多相关文章

  1. 使用VB6写一个自定义的进度信息框窗口

    一.起因说明 之前有些项目是用Access完成的,当时为了给用户显示一些进度信息,自制了一个进度信息窗体,类似下图所示: 随着项目不断变迁,需要将进度信息按阶段及子进度进行显示,并且出于代码封装的需求 ...

  2. 【Winform-自定义控件】一个自定义的进度条

    0.选择基类 public class MySlider : Control 1.设置控件的Style 在构造函数里添加: public MySlider() { //1.设置控件Style this ...

  3. HTML5简单进度环插件

    前几天做了一个进度条的插件.今天我用HTML5的arc做一个简单的进度环的插件. 代码演示 事实上非常easy的.相同,我们先用一个实例: 配置js代码 var setting = { id: &qu ...

  4. Android开发 View_自定义圆环进度条View

    前言 一个实现,空心圆环的自定义View,已经封装完好,可以直接使用. 效果图 代码 import android.content.Context; import android.graphics.C ...

  5. (转载)Android自定义ProgressDialog进度等待框

    Android自定义ProgressDialog进度等待框 作者:无缘公子 字体:[增加 减小] 类型:转载 时间:2016-01-11我要评论 这篇文章主要介绍了Android自定义Progress ...

  6. Android之自定义View以及画一个时钟

    https://www.2cto.com/kf/201509/443112.html 概述: 当Android自带的View满足不了开发者时,自定义View就发挥了很好的作用.建立一个自定义View, ...

  7. Android简单自定义圆形和水平ProgressBar

    ProgressBar简介 继承于View类,直接子类有AbsSeekBar和ContentLoadingProgressBar,其中AbsSeekBar的子类有SeekBar和RatingBar,可 ...

  8. Android 三档自定义滑动开关,禁止点击功能的实现,用默认的seekbar组件实现

    android三档自定义滑动开关,禁止点击功能的实现,普通开关网上有很多例子,三档滑动开关的则找了整天都没有相关例子,开始用普通开关的源码修改了自己实现了一个类,但效果不如人意,各种边界情况的算法很难 ...

  9. 接上一篇中记录Echarts进度环使用【不同状态不同进度环颜色及圈内文字】--采用单实例业务进行说明

    接上一篇中记录Echarts进度环使用 此处处理不同状态下不同进度环颜色及圈内文字等的相关处理,采用实际案例源码说明 -----------------偶是华丽丽分割线---------------- ...

随机推荐

  1. daemon_inetd函数

    #include <syslog.h> extern int daemon_proc; /* defined in error.c */ void daemon_inetd(const c ...

  2. Javaweb学习笔记——(十一)——————JSP、会话跟踪、Cookie、HttpSession

    JSP1.什么是JSP jsp即java server pages,它是Javaweb的动态资源. jsp = html + java脚本 + jsp动态标签(包含EL表达式)2.JSP中java脚本 ...

  3. IT这条路,适合什么人走。

    今天 ,到图书馆Study,呼,不知道为撒,看到那么多新书,那么多新技术(也不能说是新技术,就是自己没有学习过的技术),特别兴奋,学习的疲劳顿时间就没了,感觉什么都想学,都想据为己有,但是...... ...

  4. jQuery漏洞

    1.使用jQuery.append().jQuery.html()方法时,如果其中内容包含<script>脚本而没有经过任何处理的话,会执行它. 2.版本低于1.7的jQuery过滤用户输 ...

  5. IHTMLDocument2类的使用

    class Program    {        static void Main(string[] args)        {            SHDocVw.ShellWindows s ...

  6. Python使用的技巧

    1. 给你一个字符串 a, 请你输出逆序之后的a. 例如:a=‘xydz’ 则输出:zdyx a=a[::-1] print(a) 扩展:Python切片操作. 2. 给你两个正整数a和b, 输出它们 ...

  7. 【如何使用jQuery】【jQuery弹出框】【jQuery对div进行操作】【jQuery对class,id,type的操作】【jquery选择器】

    1.如何使用jQuery jQuery是一个快速.简洁的JavaScript框架,是继Prototype之后又一个优秀的JavaScript代码库(或JavaScript框架).jQuery设计的宗旨 ...

  8. cxf方式实现webservice接口笔记

    1.配置cxf的jar包依赖: 因maven中央仓库会自带cxf的相关依赖jar,故去maven官网搜索并获取pom配置到本地pom.xml文件即可,maven中央仓库搜索引擎地址:http://se ...

  9. HDU 4857 逃生(拓扑排序)

    拓扑排序 一.定义 对一个有向无环图(Directed Acyclic Graph简称DAG)G进行拓扑排序,是将G中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若<u,v> ∈ ...

  10. 20165234 预备作业3 Linux安装及学习

    一.基于VirtualBox虚拟机安装Ubuntu 这是我首次安装虚拟机,也是首次接触Linux系统.对于下学期要运用的这个操作系统,以及如何在自己的电脑上安装虚拟机,我还是有些期待和好奇的. 我一直 ...