话不多说直接上代码
自定义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.youkuaiyun.com/download/cly19940419/10309899