您的位置:首页 > 移动开发 > Android开发

自定义动态圆形ProgressBar_(一)

2017-01-04 22:08 417 查看


防IOS 自定义ProgressBar , 自带动画效果.从0 到规定的值,形成一个动态展示的效果。

思想还是挺简单的。

1:绘制背景底色圆形

2:绘制的时候起线程,线程为空,新建线程,不为空直接绘制

     线程里面执行间断绘制,每间隔10mm,从新绘制

3:线程里面绘制进度文字和进度条

这是简单的实现方式,细节适配。自定义属性,我会在  (二) 中实现。一个学习的过程

来。直接看代码,代码比较简单,欢迎吐槽

public class MyView extends View {

//画笔
Paint mPaint;
/** 画笔的宽度 */
int circleWidth = 30;
/** 半径 */
int circleRadius = 100;
/** 文字的描述 */
String textDesc;
/** 文字的大小尺寸 */
int textSize = 50;
int progress = 0;
//进度条背景的颜色(默认白色)
private int PROGRESS_BG = 0xffffffff;
//进度条,文字的颜色。默认浅蓝色
private int PROGRESS_COLOR = 0xff7fc6f8;
boolean running = true;
/** 开启线程绘制View */
MyThread myThread;
/** 画弧度递增的变量 */
private int sweepAngle;

public MyView(Context context) {
this(context, null);
}

public MyView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}

public MyView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
initView();
}

//初始化一些值
private void initView() {
mPaint = new Paint();
mPaint.setAntiAlias(true); //抗锯齿
// mPaint.setDither(true);// 设置抖动,颜色过渡更均匀
mPaint.setStrokeCap(Cap.ROUND); //画笔圆角
}

protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
//测量方法,在二中实现
}

//此方法提供给Activity中去调用。
public void setProgress(int progress) {
this.progress = progress;
invalidate();
}

//精髓在这里了,
//先绘制背景
//启动线程,在线程中绘制
protected void onDraw(final Canvas canvas) {
super.onDraw(canvas);
/** 绘制背景 */
drawbg(canvas);
if (myThread == null) {
myThread = new MyThread();
myThread.start();
} else {
drawText(canvas);
drawProgress(canvas);
}
}

// 开启一个子线程绘制ui
private class MyThread extends Thread {
@Override
public void run() {
while (running) {
logic(); //控制递增变量
postInvalidate(); //重绘制
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}

//圆弧的递增变量,
protected void logic() {
sweepAngle += 1;
if (sweepAngle == progress) {
running = false;
}
}

private void drawProgress(final Canvas canvas) {
int width = getWidth();
int height = getHeight();
mPaint.setColor(PROGRESS_COLOR);
mPaint.setStyle(Paint.Style.STROKE);
mPaint.setStrokeWidth(circleWidth);
int left = width / 2 - circleRadius;
int top = height / 2 - circleRadius;
int right = width / 2 + circleRadius;
int bottom = height / 2 + circleRadius;
RectF oval1 = new RectF(left, top, right, bottom);
int arc = sweepAngle * 360 / 100;
canvas.drawArc(oval1, 0, arc, false, mPaint);// 小弧形
}

private void drawText(final Canvas canvas) {
textDesc = sweepAngle + "%";
final int width = getWidth();
final int height = getHeight();
final Rect bounds = new Rect();
mPaint.setColor(PROGRESS_COLOR);
mPaint.setStyle(Paint.Style.FILL);
mPaint.setTextSize(textSize);
mPaint.getTextBounds(textDesc, 0, textDesc.length(), bounds);
canvas.drawText(textDesc, (width / 2) - (bounds.width() / 2),
(height / 2) + (bounds.height() / 2), mPaint);
}

private void drawbg(Canvas canvas) {
int width = getWidth();
int height = getHeight();
mPaint.setColor(PROGRESS_BG);
mPaint.setStyle(Paint.Style.FILL_AND_STROKE);
mPaint.setStrokeWidth(circleWidth);
canvas.drawCircle(width / 2, height / 2, circleRadius, mPaint);
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息