自定义view 圆形进度条

话不多说直接上代码

 自定义view首先当然要 写几个构造方法了

  private Paint paint;
    private Paint paint2;
    private Paint paint3;
    private float circleText=13;
    private int height;
    private int width ;

    private boolean startAnimation = true;
    private  boolean noLayoutRefresh=true;
    public PieView(Context context) {
        this(context,null);
    }

    public PieView(Context context, AttributeSet attrs) {
        this(context, attrs,0);
    }

    public PieView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
         if(attrs !=null){                                   //下面那段代码去获取 xml中写的属性          
             TypedArray typedArray = context.getTheme().obtainStyledAttributes(attrs, R.styleable.PieView, defStyleAttr, 0);
             for (int i = 0; i < typedArray.length(); i++) {
                 int index = typedArray.getIndex(i);
                 switch (index){
                     case R.styleable.PieView_textSize:
                         circleText = typedArray.getDimensionPixelSize(index,13);
                         break;
                 }
             }
         }

    }

开始测量了 

 @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        int modeW = MeasureSpec.getMode(widthMeasureSpec);
        int sizeW = MeasureSpec.getSize(widthMeasureSpec);

        if(noLayoutRefresh) {
            noLayoutRefresh=false;
            int modeH = MeasureSpec.getMode(heightMeasureSpec);
            int sizeH = MeasureSpec.getSize(heightMeasureSpec);
            if (modeW == MeasureSpec.EXACTLY) { //相当于设置了精确值 如 maniparent  149dp
                width = sizeW;
            } else {
                width = getMeasuredWidth() + getPaddingRight() + getPaddingLeft();

               if (modeW == MeasureSpec.AT_MOST) {
             /*if(mode == MeasureSpec.AT_MOST)*/
                   width = Math.min(width,sizeW);
                }
            }
            if (modeH == MeasureSpec.EXACTLY) {
                height = sizeH;
            } else  {

                height = getMeasuredHeight() + getPaddingTop() + getPaddingBottom();
                if (modeH == MeasureSpec.AT_MOST) {
                    height = Math.min(height,sizeH);
                }

            }

            setMeasuredDimension(width, height);
            init();
        }
    }

 
 
 
 

初始化一些属性

 private void init() {
        paint = new Paint(Paint.ANTI_ALIAS_FLAG);
        paint.setColor(Color.LTGRAY);
        paint.setStrokeWidth(20);
        paint.setStyle(Paint.Style.STROKE);

        paint2 = new Paint(Paint.ANTI_ALIAS_FLAG);
        paint2.setColor(Color.YELLOW);
        paint2.setStrokeCap(Paint.Cap.ROUND);//圆形
        paint2.setStrokeWidth(20);
        paint2.setStyle(Paint.Style.STROKE);

        paint3 = new Paint();
        paint3.setColor(Color.GRAY);
        paint3.setTextSize(circleText);

        height = height/2;
        width = width/2;
        if(startAnimation) {
            setValue(500,230);
           startAnimation = false;
        }
    }

 开始画了

  @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);

         int r = width - DensityUtil.dip2px(MyApplication.context,20);
         if(height < width){
                 r = height -DensityUtil.dip2px(MyApplication.context,20);;
         }
        canvas.drawCircle(width, height,r,paint);   //绘制圆
        RectF rectF = new RectF();
        rectF.set(width -r, height -r, width +r, height +r);
        canvas.drawArc(rectF,90,mParent,false,paint2);  //绘制圆形进度条
        Rect rect = new Rect();
        paint3.getTextBounds(mContent,0,mContent.length(),rect);   

        canvas.drawText(mContent, width -rect.width()/2, height +rect.height()/2,paint3);  //绘制文字
        canvas.restore();

 开启动画让进度条动起来

 private void startAnimator(float start, float end, long animTime) {
        ValueAnimator     mAnimator = new ValueAnimator();

          mAnimator = ValueAnimator.ofFloat(start, end);
        mAnimator.setDuration(animTime);
        mAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator animation) {
                mParent = (float) animation.getAnimatedValue();
                mContent=((int)mParent)+"度";
             
                invalidate();
            }
        });
        mAnimator.start();
    }

//这个demo中包含了  弹性布局

还有自定义 了超级简单的 Butterknife


最后奉上demo地址

https://download.csdn.net/download/cly19940419/10309899

猜你喜欢

转载自blog.csdn.net/cly19940419/article/details/79689106