源代码及可执行文件下载地址: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. 数据建模工具系列 之 让SQL Power Architect支持Vertica

    几款数据建模软件评估 下面是流行几款数据建模软件: 软件 特点 支持Vertica? 免费? ERWin 功能强大, 操作较繁琐 不支持Vertica 商业软件,价格高 Power Designer ...

  2. thinkcmf 相关

    后台登录,暂停关掉登录验证码: /Volumes/macHD2/myCode/wwwroot/app/admin/controller/PublicController.php $captcha = ...

  3. zookeeper客户端 zkCli使用及常用命令

    上篇(http://www.cnblogs.com/yangzhenlong/p/8270835.html)zk伪集群搭建好后,使用zkCli连接zk服务 切换到zk1/bin 目录,执行zkCli. ...

  4. Docker - rm 命令

    Docker rm 命令 docker rm :删除容器 docker rm [OPTIONS] CONTAINER [CONTAINER...] -f # 通过SIGKILL信号强制删除一个运行中的 ...

  5. Linux 文件大小查找排序

    du -sh 文件大小查询: 1.当前目录的大小: du -sh | sort 2.当前 目录下的文件大小: ls -lsh 3.当前目录 下的文件大小排序: du -sh * |sort -n 4. ...

  6. webpack提示安装webpack-cli

    webpack 安装后提示CLI webpack 4X 后需要安装webpack-cli 请注意需要安装在同一目录 方法: 第一步:npm install -g webpack-cli 第二部: 同步 ...

  7. Kaldi的nnet2 Component

    FixedAffineComponent:类 LDA-like 的非相关转换,由标准的 weight matrix plus bias 组成(即Wx+b),通过标准的 stochastic gradi ...

  8. Flume配置Failover Sink Processor

    1 官网内容 2 看一张图一目了然 3 详细配置 source配置文件 #配置文件: a1.sources= r1 a1.sinks= k1 k2 a1.channels= c1 #负载平衡 a1.s ...

  9. Element-ui 中dialog的使用方法

    <template> <div> <el-button type="text" @click="dialogFormVisible = tr ...

  10. mui列表系列

    详细操作见代码: <!doctype html> <html> <head> <meta charset="UTF-8"> < ...