Android一个自定义的进度环:ProgressChart

源代码及可执行文件下载地址: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);
	}

}
时间: 2024-09-30 14:30:38

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

Android HorizontalProgressBar 自定义横向进度条

Android HorizontalProgressBar 横线进度条 效果图如下: 自定义需要继承  ProgressBar: 直接在布局文件中引用: ' 设置进度: ' 样式文件:   下载地址:https://download.csdn.net/download/littyzhon/10420429 参考地址:https://www.jianshu.com/p/777e67db5b53 原文地址:https://www.cnblogs.com/code-wind/p/9050738.htm

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

一.起因说明 之前有些项目是用Access完成的,当时为了给用户显示一些进度信息,自制了一个进度信息窗体,类似下图所示: 随着项目不断变迁,需要将进度信息按阶段及子进度进行显示,并且出于代码封装的需求,需要将其封装到一个dll文件中.最终完成的效果如下图: 调用该进度信息框的代码类似如下所示: 1 Private Sub cmdCommand1_Click() 2 Dim pb As New CProgressBar 3 pb.AddStage "第一步", 10000 4 pb.Ad

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

背景介绍 在Android 开发中,我们经常遇到各种各样绚丽的控件,所以,依靠我们Android本身所带的控件是远远不够的,很多时候需要我们自己定义控件,在开发的过程中,我们公司遇到了一种需要自己写的一个自定义带进度的圆形进度条,看起来非常的绚丽,当然还有一些其他的,比如:水纹形的圆形进度条等效果都是非常nice的.如果哪位朋友有实现,希望分享出来,我也好学习学习.好了多的不说,接下来,我们就来看看来如何实现圆形进度条. 原文地址:http://blog.csdn.net/xiaanming/a

写一个自定义进度颜色和圆形转动的ProgressBar(详细介绍)

先上图: 我们得自定义ProgressBar的样式 <span style="white-space:pre"> </span><style name="self_define_ProgressBar" parent="@android:style/Widget.ProgressBar.Horizontal"> //继承了android横向的ProgressBar的样式 <item name="

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

自定义圆形进度条效果图如下:应用场景如动态显示分数等. view的自定义属性如下attr.xml <?xml version="1.0" encoding="UTF-8"?> <resources> <declare-styleable name="ArcProgressbar">         <!-- 圆环起始角度-->         <attr name="startAng

Android 自定义圆圈进度并显示百分比例控件(纯代码实现)

首先,感谢公司能给我闲暇的时间,来稳固我的技术,让我不断的去探索研究,在此不胜感激. 先不说实现功能,上图看看效果 这个是续上一次水平变色进度条的有一个全新的控件,理论实现原理 1.分析控件:该控件基本上是圆圈内嵌圆圈: 2.进度计算:其实是小学二年级数学题:当前进度/总数=百分比: 3.中间时间:呵呵,纯粹忽悠,不解释(当前时间). 理论总是和实践差距的太远,不扯淡,不吹嘘,贴代码: package com.spring.progressview; import java.text.Simpl

android如何写一个自定义的dialog可以在Title的位置弹出来

先上效果图: Title的Layout为: <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="@dimen/title_h

android一个上传图片的例子,包括如何终止上传过程,如果在上传的时候更新进度条(一)

先上效果图: Layout为: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent&quo

Android实现一个自定义相机的界面

我们先实现拍照按钮的圆形效果哈,Android开发中,当然可以找美工人员设计图片,然后直接拿进来,不过我们可以自己写代码实现这个效果哈,最常用的的是用layout-list实现图片的叠加,我们这个layout命名为btn_take_photo.xml,这是一个自定义的drawable文件,所以按照规范,我们要将它放在drawable文件夹里 注意:drawable文件夹一般是来放自定义的drawable文件的,可以将它看成自己写的背景样式等等哦 解释代码: layer-list里面放3个item