这个进度条非常实用,可以有进度的显示,可以自定义圆内部和边缘的颜色等,话不都说,先看效果再上车,


直接上代码:

调用实例

package android.example.com.roundprogressbar;import android.app.Activity;import android.os.Bundle;import android.os.CountDownTimer;import android.util.Log;import android.widget.TextView;public class MainActivity extends Activity {    private RoundProgressBar mProgressBar;    private TextView mTextview;    private final long DURATION_TIME = 6*1000;    private final int TOTAL_PROGRESS = 100;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        mProgressBar = (RoundProgressBar) findViewById(R.id.id_progress_bar);        mTextview = (TextView) findViewById(R.id.textview);        mTimer.start();    }    /**     * 每隔一秒钟执行一次,总共5分钟     */    private CountDownTimer mTimer = new CountDownTimer(DURATION_TIME, 100) {        @Override        public void onTick(long millisUntilFinished) {            // 每隔一秒调用一次,剩余多少时间            int progress = (int)(TOTAL_PROGRESS*(DURATION_TIME - millisUntilFinished) / DURATION_TIME);            mProgressBar.setProgress(progress);            mTextview.setText(progress + "");        }        @Override        public void onFinish() {            // 执行完毕            mProgressBar.setProgress(TOTAL_PROGRESS);            mTextview.setText(TOTAL_PROGRESS + "");        }    };    @Override    protected void onDestroy() {        super.onDestroy();        mTimer.cancel();        mTimer = null;    }}
<?xml version="1.0" encoding="utf-8"?>        

下面是自定义圆形进度条代码:

package android.example.com.roundprogressbar;import android.annotation.SuppressLint;import android.content.Context;import android.content.res.TypedArray;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;import android.graphics.RectF;import android.graphics.Typeface;import android.util.AttributeSet;import android.view.View;/** * 带进度的进度条,线程安全的View,可直接在线程中更新进度 * * @author Alex * @date 2016-05-18 * */@SuppressLint("DrawAllocation")public class RoundProgressBar extends View {/** * 画笔对象的引用 */private Paint paint;/** * 圆环的颜色 */private int roundColor;/** * 圆环进度的颜色 */private int roundProgressColor;/** * 中间进度百分比的字符串的颜色 */private int textColor;/** * 中间进度百分比的字符串的字体 */private float textSize;/** * 圆环的宽度 */private float roundWidth;/** * 最大进度 */private int max;/** * 当前进度 */private int progress;/** * 进度圆环的起始角度 */private int startAngle;/** * 进度圆环的扫描角度 */private int sweepAngle;/** * 是否显示中间的进度 */private boolean textIsDisplayable;/** * 进度的风格,实心或者空心 */private int style;public static final int STROKE = 0;public static final int FILL = 1;public RoundProgressBar(Context context) {this(context, null);}public RoundProgressBar(Context context, AttributeSet attrs) {this(context, attrs, 0);}public RoundProgressBar(Context context, AttributeSet attrs, int defStyle) {super(context, attrs, defStyle);paint = new Paint();TypedArray mTypedArray = context.obtainStyledAttributes(attrs,R.styleable.RoundProgressBar);// 获取自定义属性和默认值roundColor = mTypedArray.getColor(R.styleable.RoundProgressBar_roundColor, Color.RED);roundProgressColor = mTypedArray.getColor(R.styleable.RoundProgressBar_roundProgressColor, Color.GREEN);textColor = mTypedArray.getColor(R.styleable.RoundProgressBar_txtColor, Color.GREEN);textSize = mTypedArray.getDimension(R.styleable.RoundProgressBar_txtSize, 15);roundWidth = mTypedArray.getDimension(R.styleable.RoundProgressBar_roundWidth, 5);max = mTypedArray.getInteger(R.styleable.RoundProgressBar_max, 100);startAngle = mTypedArray.getInteger(R.styleable.RoundProgressBar_startAngle, 0);sweepAngle = mTypedArray.getInteger(R.styleable.RoundProgressBar_sweepAngle, 360);textIsDisplayable = mTypedArray.getBoolean(R.styleable.RoundProgressBar_textIsDisplayable, true);style = mTypedArray.getInt(R.styleable.RoundProgressBar_style, 0);mTypedArray.recycle();}@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);/** * 画最外层的大圆环 */int centre = getWidth() / 2; // 获取圆心的x坐标int radius = (int) (centre - roundWidth / 2); // 圆环的半径paint.setStrokeCap(Paint.Cap.ROUND);paint.setColor(roundColor); // 设置圆环的颜色paint.setStyle(Paint.Style.FILL); // 设置空心//paint.setStrokeWidth(roundWidth); // 设置圆环的宽度paint.setAntiAlias(true); // 消除锯齿canvas.drawCircle(centre, centre, radius, paint); // 画出圆环/** * 画进度百分比 */paint.setStrokeWidth(0);paint.setColor(textColor);paint.setTextSize(textSize);paint.setTypeface(Typeface.DEFAULT_BOLD); // 设置字体int percent = (int) (((float) progress / (float) max) * 100); // 中间的进度百分比,先转换成float在进行除法运算,不然都为0float textWidth = paint.measureText(percent + "%"); // 测量字体宽度,我们需要根据字体的宽度设置在圆环中间if (textIsDisplayable && percent != 0 && style == STROKE) {canvas.drawText(percent + "%", centre - textWidth / 2, centre+ textSize / 2, paint); // 画出进度百分比}/** * 画圆弧 ,画圆环的进度 */// 设置进度是实心还是空心paint.setStrokeWidth(roundWidth); // 设置圆环的宽度paint.setColor(roundColor); // 设置进度的颜色RectF oval = new RectF(centre - radius, centre - radius, centre+ radius, centre + radius); // 用于定义的圆弧的形状和大小的界限switch (style) {case STROKE: {paint.setStyle(Paint.Style.STROKE);canvas.drawArc(oval, startAngle, sweepAngle, false, paint); // 根据进度画圆弧paint.setColor(roundProgressColor); // 设置进度的颜色paint.setStyle(Paint.Style.STROKE);canvas.drawArc(oval, startAngle, sweepAngle * progress / max, false, paint); // 根据进度画圆弧break;}case FILL: {paint.setStyle(Paint.Style.FILL_AND_STROKE);if (progress != 0)canvas.drawArc(oval, 0, 360 * progress / max, true, paint); // 根据进度画圆弧break;}}}public synchronized int getMax() {return max;}/** * 设置进度的最大值 * * @param max */public synchronized void setMax(int max) {if (max < 0) {throw new IllegalArgumentException("max not less than 0");}this.max = max;}/** * 获取进度.需要同步 * * @return */public synchronized int getProgress() {return progress;}/** * 设置进度,此为线程安全控件,由于考虑多线的问题,需要同步 刷新界面调用postInvalidate()能在非UI线程刷新 * * @param progress */public synchronized void setProgress(int progress) {if (progress < 0) {throw new IllegalArgumentException("progress not less than 0");}if (progress > max) {progress = max;}if (progress <= max) {this.progress = progress;postInvalidate();}}public int getCricleColor() {return roundColor;}public void setCricleColor(int cricleColor) {this.roundColor = cricleColor;}public int getCricleProgressColor() {return roundProgressColor;}public void setCricleProgressColor(int cricleProgressColor) {this.roundProgressColor = cricleProgressColor;}public int getTextColor() {return textColor;}public void setTextColor(int textColor) {this.textColor = textColor;}public float getTextSize() {return textSize;}public void setTextSize(float textSize) {this.textSize = textSize;}public float getRoundWidth() {return roundWidth;}public void setRoundWidth(float roundWidth) {this.roundWidth = roundWidth;}}

还有自定义属性,res/values/attrs.xml,

<?xml version="1.0" encoding="utf-8"?>                                                                                                                        

代码就贴完了,下面提供下项目例子地址,

点击打开链接

http://download.csdn.net/detail/msn465780/9793849








更多相关文章

  1. android sqlite相关
  2. 【Android(安卓)开发教程】显示复杂对话框
  3. 开源整理(持续更新)
  4. Android自定义控件之自定义进度条
  5. webView头部加进度加载效果
  6. Android视频播放项目总结之 使用VideoView定义自己的视频播放器
  7. Android(安卓)progressbar实现带底部指示器和文字的进度条
  8. 新浪下载图片的ProgressBar进度样式源码
  9. Android(安卓)github开源进度条类框架SmoothProgressBar的使用

随机推荐

  1. 10个经典的Android开源应用项目
  2. Android中的网络时间同步
  3. Android(安卓)P 图像显示系统(三)Android(
  4. Android(安卓)发邮件
  5. 2016这一年,回顾我们一起走过的"编码美丽"
  6. 2013学Android不得不看的13个视频课程(共
  7. Android中的网络时间同步
  8. Android流媒体
  9. Android架构
  10. Android一个简单的socket通信手机间推送