美文网首页
自定义View(圆形进度条)

自定义View(圆形进度条)

作者: 撩人的风光 | 来源:发表于2020-03-17 13:54 被阅读0次

    /**

    * Created by dell

    * on 2020/3/17

    * The package is com.video.universalplayer

    * This Class is ...

    */

    public class CircleProgressbarextends View {

    private PaintmCirclePaint;

    private PaintmTextPaint;

    private PaintmArcPaint;

    private float mPercentProgress;

    private int mInnerColor;

    private int mOutColor;

    private int mInnerCircleWidth;

    private int mOutCircleWidth;

    private Stringtext ="下载";

    public CircleProgressbar(Context context) {

    this(context,null);

    }

    public CircleProgressbar(Context context,@Nullable AttributeSet attrs) {

    this(context, attrs,0);

    }

    public CircleProgressbar(Context context,@Nullable AttributeSet attrs,int defStyleAttr) {

    super(context, attrs, defStyleAttr);

    TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.CircleProgressbar);

    mInnerColor = typedArray.getColor(R.styleable.CircleProgressbar_innerCircleColor, ContextCompat.getColor(getContext(), R.color.colorPrimary));

    mOutColor = typedArray.getColor(R.styleable.CircleProgressbar_outCircleColor, ContextCompat.getColor(getContext(), R.color.colorAccent));

    mInnerCircleWidth = (int) typedArray.getDimension(R.styleable.CircleProgressbar_innerCircleWidth, DensityUtil.dip2px(getContext(),2));

    mOutCircleWidth = (int) typedArray.getDimension(R.styleable.CircleProgressbar_innerCircleWidth, DensityUtil.dip2px(getContext(),2));

    typedArray.recycle();

    initPaint();

    }

    private void initPaint() {

    mCirclePaint =new Paint();

    mCirclePaint.setAntiAlias(true);

    mCirclePaint.setColor(mInnerColor);

    mCirclePaint.setStrokeWidth(mInnerCircleWidth);

    mCirclePaint.setStyle(Paint.Style.STROKE);

    mTextPaint =new TextPaint();

    mTextPaint.setAntiAlias(true);

    mTextPaint.setTextSize(DensityUtil.dip2px(getContext(),12));

    mArcPaint =new Paint();

    mArcPaint.setAntiAlias(true);

    mArcPaint.setColor(mOutColor);

    mArcPaint.setStrokeWidth(mOutCircleWidth);

    mArcPaint.setStyle(Paint.Style.STROKE);

    }

    @Override

        protected void onMeasure(int widthMeasureSpec,int heightMeasureSpec) {

    super.onMeasure(widthMeasureSpec, heightMeasureSpec);

    int width = MeasureSpec.getSize(widthMeasureSpec);

    int height = MeasureSpec.getSize(heightMeasureSpec);

    setMeasuredDimension(width > height ? height : width, width > height ? height : width);

    }

    @Override

        protected void onDraw(Canvas canvas) {

    drawCircle(canvas);

    drawText(canvas);

    drawArc(canvas);

    }

    /**

    * 画圆

    *

        * @param canvas

        */

        private void drawCircle(Canvas canvas) {

    float cx = getWidth() >>1;

    float cy = getHeight() >>1;

    canvas.drawCircle(cx, cy, (getWidth() -mOutCircleWidth) >>1,mCirclePaint);

    }

    /**

    * 画文字

    *

        * @param canvas

        */

        private void drawText(Canvas canvas) {

    Rect textBounds =new Rect();

    mTextPaint.getTextBounds(text,0,text.length(), textBounds);

    int dx = getWidth() /2 - textBounds.width() /2;

    Paint.FontMetricsInt fontMetrics =mTextPaint.getFontMetricsInt();

    int dy = (fontMetrics.bottom - fontMetrics.top) /2 - fontMetrics.bottom;

    int baseLine = getHeight() /2 + dy;

    canvas.drawText(text, dx, baseLine,mTextPaint);

    }

    /**

    * 画进度

    *

        * @param canvas

        */

        private void drawArc(Canvas canvas) {

    RectF rectF =new RectF(mOutCircleWidth >>1,mOutCircleWidth >>1,

    getWidth() - (mOutCircleWidth >>1), getHeight() - (mOutCircleWidth >>1));

    float sweepAngle =mPercentProgress *360;

    canvas.drawArc(rectF,0, sweepAngle,false,mArcPaint);

    }

    public synchronized void setCurrentProgress(float currentProgress) {

    this.mPercentProgress = currentProgress;

    if (mPercentProgress >0) {

    text = (int) (mPercentProgress *100) +"%";

    }

    invalidate();

    }

    public synchronized void setText(String text) {

    this.text = text;

    invalidate();

    }

    public synchronized String getText() {

    return text;

    }

    }

    相关文章

      网友评论

          本文标题:自定义View(圆形进度条)

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