话不多说直接上代码
自定义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