Android自定义View---圆形进度条

来源:互联网 发布:linux 远程连接问题 编辑:程序博客网 时间:2024/04/30 21:01

原理非常简单,在自定义View的基础上使用Canvas的drawCircle画两个圆,一个圆代表总体,一个圆代表现有进度,在主线程中使用set方法在Handler中传递进度,进度和总体都可以添加set、get方法进行自定义
这里写图片描述

//主线程代码如下public class MainActivity extends Activity {private Button mBtn_start;private MyProgresscircle myProgresscircle;private int progress;private Handler handler=new Handler(){@Overridepublic void handleMessage(Message msg) {super.handleMessage(msg);switch (msg.what){case 0:progress++;if(progress<=100){//形成循环myProgresscircle.setCurrentProgress(progress);//传递进度handler.sendEmptyMessageDelayed(0,200);//模拟下载延迟                    }break;            }        }    };@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);myProgresscircle= (MyProgresscircle) findViewById(R.id.myprogress);mBtn_start= (Button) findViewById(R.id.button_start);mBtn_start.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {handler.sendEmptyMessage(0);//启动下载发送一个空消息开始            }        });    }}//自定义View代码:public class MyProgresscircle extends View {private int width;private int height;private Paint mPaintText;private Paint mPaintCircle;private Paint mPaintCircleCurrent;private int CurrentProgress;private int MaxProgress=100;public void setCurrentProgress(int currentProgress) {CurrentProgress = currentProgress;        invalidate();    }public int getMaxProgress() {return MaxProgress;    }public void setMaxProgress(int maxProgress) {MaxProgress = maxProgress;    }public MyProgresscircle(Context context) {super(context);    }public MyProgresscircle(Context context, AttributeSet attrs) {super(context, attrs);mPaintText=new Paint();//字体进度画笔mPaintText.setTextSize(80);mPaintText.setColor(Color.WHITE);mPaintText.setStrokeWidth(10);mPaintText.setTextAlign(Paint.Align.CENTER);//偏移mPaintCircle=new Paint();//外圆画笔mPaintCircle.setColor(Color.GRAY);mPaintCircle.setAntiAlias(true);mPaintCircle.setStrokeWidth(10);mPaintCircleCurrent=new Paint();//进度圆画笔mPaintCircleCurrent.setColor(Color.YELLOW);mPaintCircleCurrent.setAntiAlias(true);mPaintCircleCurrent.setStrokeWidth(10);    }@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {//这个复写方法用来得到宽和高super.onMeasure(widthMeasureSpec, heightMeasureSpec);width = getDefaultSize(getSuggestedMinimumWidth(), widthMeasureSpec);height = getDefaultSize(getSuggestedMinimumHeight(), heightMeasureSpec);        setMeasuredDimension(width, height);    }@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);        canvas.drawCircle(width / 2, height / 2, 200, mPaintCircle);        canvas.drawCircle(width/2,height/2,CurrentProgress/100f*200,mPaintCircleCurrent);        canvas.drawText(CurrentProgress*100f/MaxProgress+"%",width/2,height/2,mPaintText);//把进度转化为百分比    }}
0 0
原创粉丝点击