美文网首页Android
自定义圆形进度条(文字;动画{后面的动画会顶掉正在做的动画})

自定义圆形进度条(文字;动画{后面的动画会顶掉正在做的动画})

作者: 简书_朱聪 | 来源:发表于2017-12-22 10:19 被阅读0次

    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;

    /**

    * 圆形进度条,有动画效果.

    */

    public classMainCircleProgressViewextendsView{

    //最大进度

    private doublemMaxProgress=100;

    //目前进度

    private doublemProgress=30;

    // 画圆所在的距形区域

    private finalRectFmRectF;

    private finalPaintmPaint;

    //文字变量

    privateStringmTopText;

    privateStringmCenterText;

    privateStringmBottomText;

    //管理线程,一个新动画线程进来,前面的动画线程会停止

    private intmProgressManger=0;

    publicMainCircleProgressView(Contextcontext,AttributeSetattrs) {

    super(context,attrs);

    mRectF=newRectF();

    mPaint=newPaint();

    mCenterText="";

    }

    @Override

    protected voidonMeasure(intwidthMeasureSpec,intheightMeasureSpec) {

    //谁比较宽就用谁

    if(heightMeasureSpec<=widthMeasureSpec) {

    super.onMeasure(heightMeasureSpec,heightMeasureSpec);

    }else{

    super.onMeasure(widthMeasureSpec,widthMeasureSpec);

    }

    }

    @Override

    protected voidonDraw(Canvascanvas) {

    intcircleLineStrokeWidth=15;

    inttextStrokeWidth=2;

    super.onDraw(canvas);

    intwidth=this.getWidth();

    intheight=this.getHeight();

    if(width!=height) {

    intmin=Math.min(width,height);

    width=min;

    height=min;

    }

    // 设置画笔相关属性

    mPaint.setAntiAlias(true);

    mPaint.setColor(Color.rgb(83,88,88));

    mPaint.setAlpha(50);

    canvas.drawColor(Color.TRANSPARENT);

    mPaint.setStrokeWidth(circleLineStrokeWidth);

    mPaint.setStyle(Paint.Style.STROKE);

    // 位置

    mRectF.left=circleLineStrokeWidth/2;// 左上角x

    mRectF.top=circleLineStrokeWidth/2;// 左上角y

    mRectF.right=width-circleLineStrokeWidth/2;// 左下角x

    mRectF.bottom=height-circleLineStrokeWidth/2;// 右下角y

    // 绘制圆圈,进度条背景

    canvas.drawArc(mRectF,-90,360,false,mPaint);

    mPaint.setColor(Color.WHITE);

    canvas.drawArc(mRectF,-90,(float) ((mProgress/mMaxProgress) *360),false,mPaint);

    // 绘制中间文字

    mPaint.setStrokeWidth(textStrokeWidth);

    String text=mCenterText;

    inttextHeight=height/4;

    mPaint.setTextSize(textHeight);

    inttextWidth= (int)mPaint.measureText(text,0,text.length());

    mPaint.setStyle(Paint.Style.FILL);

    canvas.drawText(text,width/2-textWidth/2,height/2+textHeight/2,mPaint);

    // 绘制上面文字

    textHeight=height/10;

    if(!TextUtils.isEmpty(mTopText)) {

    mPaint.setStrokeWidth(textStrokeWidth);

    text=mTopText;

    mPaint.setTextSize(textHeight);

    mPaint.setColor(Color.WHITE);

    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(mBottomText)) {

    mPaint.setStrokeWidth(textStrokeWidth);

    text=mBottomText;

    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);

    }

    }

    //设置进程并刷新界面,UI线程实时刷新,干掉动画.

    public voidsetProgress(doubleprogress) {

    mProgressManger++;

    this.mProgress= progress;

    this.invalidate();

    }

    public voidsetProgressNotInUiThread(doubleprogress) {

    this.mProgress= progress;

    this.postInvalidate();

    }

    public voidsetMaxProgress(doublemaxProgress) {

    this.mMaxProgress= maxProgress;

    }

    public voidsetBottomText(StringbottomText) {

    this.mBottomText= bottomText;

    }

    public voidsetTopText(StringtopText) {

    this.mTopText= topText;

    }

    public voidsetCenterText(StringcenterText) {

    this.mCenterText= centerText;

    }

    public voidsetProgressAnimation(final doubleprogress){

    final intnumber= ++mProgressManger;

    newThread(newRunnable() {

    @Override

    public voidrun() {

    if(progress==0) {

    return;

    }

    doublefp=mMaxProgress*0.0025;

    doublecurrentProgress=fp;

    while(true) {

    if(number!=mProgressManger){

    return;

    }

    if(progress

    setProgressNotInUiThread(progress);

    return;

    }else{

    setProgressNotInUiThread(currentProgress);

    currentProgress+=fp;

    }

    try{

    Thread.sleep(5);

    }catch(InterruptedExceptione) {

    e.printStackTrace();

    }

    }

    }

    }).start();

    }

    }

    相关文章

      网友评论

        本文标题:自定义圆形进度条(文字;动画{后面的动画会顶掉正在做的动画})

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