美文网首页Android开发常用代码
Android常用控件之ProgressBar,圆形进度条

Android常用控件之ProgressBar,圆形进度条

作者: 才兄说 | 来源:发表于2017-06-09 22:56 被阅读73次

    目录:android.widget.ProgressBar

    前言:中间带百分比的圆形进度条
    xml布局

    <com.jianshu.CircleProgressView
        android:id="@+id/circleProgressbar"
        android:layout_width="74dp"
        android:layout_height="74dp"
        android:layout_centerInParent="true" />
    

    自定义view:

    public class CircleProgressView extends View {
       private static final String TAG = "CircleProgressView";
    
       private final int mCircleLineStrokeWidth = 8;
    
       private final int mTxtStrokeWidth = 2;
    
       // 画圆所在的距形区域
       private final RectF mRectF;
    
       private final Paint mPaint;
    
       private final Context mContext;
    
       private int mMaxProgress = 100;
    
       private int mProgress = 30;
    
       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 / 3, 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 / 4, mPaint);
           }
       }
    
       public int getMaxProgress() {
           return mMaxProgress;
       }
    
       public void setMaxProgress(int maxProgress) {
           this.mMaxProgress = maxProgress;
       }
    
       public void setProgress(int progress) {
           this.mProgress = progress;
           this.invalidate();
       }
    
       //非UI线程调用
       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;
       }
    }
    

    相关文章

      网友评论

        本文标题:Android常用控件之ProgressBar,圆形进度条

        本文链接:https://www.haomeiwen.com/subject/lkxqqxtx.html