自定义View(圆形进度条)

2020-03-17  本文已影响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;

}

}

上一篇 下一篇

猜你喜欢

热点阅读