自定义View圆形进度条

来源:互联网 发布:java现在还有用吗 编辑:程序博客网 时间:2024/04/28 12:16

package recitewords.apj.com.recitewords.view;/** * Created by Seven on 2016/12/2. */import android.content.Context;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;import android.graphics.RectF;import android.text.TextUtils;import android.util.AttributeSet;import android.view.View;/** * Created by Seven on 2016/12/2. */public class CircleProgressView extends View {    private static final String TAG = "CircleProgressBar";    private int mMaxProgress = 100;    private int mProgress = 0;    private final int mCircleLineStrokeWidth = 8;    private final int mTxtStrokeWidth = 2;    // 画圆所在的距形区域    private final RectF mRectF;    private final Paint mPaint;    private final Context mContext;    private String mTxtHint1;    private String mTxtHint2;    public CircleProgressView(Context context, AttributeSet attrs) {        super(context, attrs);        mContext = context;        mRectF = new RectF();        mPaint = new Paint();    }    @Override    protected void onDraw(Canvas canvas) {        super.onDraw(canvas);        int width = this.getWidth();        int height = this.getHeight();        if (width != height) {            int min = Math.min(width, height);            width = min;            height = min;        }        // 设置画笔相关属性        mPaint.setAntiAlias(true);        mPaint.setColor(Color.rgb(0xe9, 0xe9, 0xe9));        canvas.drawColor(Color.TRANSPARENT);        mPaint.setStrokeWidth(mCircleLineStrokeWidth);        mPaint.setStyle(Paint.Style.STROKE);        // 位置        mRectF.left = mCircleLineStrokeWidth / 2; // 左上角x        mRectF.top = mCircleLineStrokeWidth / 2; // 左上角y        mRectF.right = width - mCircleLineStrokeWidth / 2; // 左下角x        mRectF.bottom = height - mCircleLineStrokeWidth / 2; // 右下角y        // 绘制圆圈,进度条背景        canvas.drawArc(mRectF, -90, 360, false, mPaint);        mPaint.setColor(Color.rgb(0xf8, 0x60, 0x30));        canvas.drawArc(mRectF, -90, ((float) mProgress / mMaxProgress) * 360, false, mPaint);        // 绘制进度文案显示        mPaint.setStrokeWidth(mTxtStrokeWidth);        String text = mProgress + "%";        int textHeight = height / 4;        mPaint.setTextSize(textHeight);        int textWidth = (int) mPaint.measureText(text, 0, text.length());        mPaint.setStyle(Paint.Style.FILL);        canvas.drawText(text, width / 2 - textWidth / 2, height / 2 + textHeight / 2, mPaint);        if (!TextUtils.isEmpty(mTxtHint1)) {            mPaint.setStrokeWidth(mTxtStrokeWidth);            text = mTxtHint1;            textHeight = height / 8;            mPaint.setTextSize(textHeight);            mPaint.setColor(Color.rgb(0x99, 0x99, 0x99));            textWidth = (int) mPaint.measureText(text, 0, text.length());            mPaint.setStyle(Paint.Style.FILL);            canvas.drawText(text, width / 2 - textWidth / 2, height / 4 + textHeight / 2, mPaint);        }        if (!TextUtils.isEmpty(mTxtHint2)) {            mPaint.setStrokeWidth(mTxtStrokeWidth);            text = mTxtHint2;            textHeight = height / 8;            mPaint.setTextSize(textHeight);            textWidth = (int) mPaint.measureText(text, 0, text.length());            mPaint.setStyle(Paint.Style.FILL);            canvas.drawText(text, width / 2 - textWidth / 2, 3 * height / 4 + textHeight / 2, mPaint);        }    }    public int getMaxProgress() {        return mMaxProgress;    }    public void setMaxProgress(int maxProgress) {        this.mMaxProgress = maxProgress;    }    public void setProgress(int progress) {        this.mProgress = progress;        this.invalidate();    }    public void setProgressNotInUiThread(int progress) {        this.mProgress = progress;        this.postInvalidate();    }    public String getmTxtHint1() {        return mTxtHint1;    }    public void setmTxtHint1(String mTxtHint1) {        this.mTxtHint1 = mTxtHint1;    }    public String getmTxtHint2() {        return mTxtHint2;    }    public void setmTxtHint2(String mTxtHint2) {        this.mTxtHint2 = mTxtHint2;    }}

以上是自定义View的源码。


在布局文件的引用如下:

<recitewords.apj.com.recitewords.view.CircleProgressView    android:id="@+id/review_progress"    android:layout_width="80dp"    android:layout_height="80dp"    android:layout_gravity="center">

在Activity设置进度:

holder.progress.setProgress(25);

可用Handler来动态设置进度。


0 0
原创粉丝点击