1.在values下面新建一个attrs.xml,现在里面定义我们的自定义属性,
<?xml version="1.0" encoding="utf-8"?> <resources><declare-styleable name="RoundProgressBar"><attr name="roundColor" format="color"></attr><attr name="roundProgressColor" format="color"></attr><attr name="roundWidth" format="dimension"></attr><attr name="textColor" format="color"></attr><attr name="textSize" format="dimension"></attr><attr name="max" format="integer"></attr><attr name="textIsDisplayable" format="boolean"></attr><attr name="style"><enum name="STROKE" value="0"></enum><enum name="FILL" value="1"></enum></attr></declare-styleable></resources>
2、创建一个customView 自定义view类
package com.example.customprogress;import android.content.Context; import android.content.res.TypedArray; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.RectF; import android.graphics.Typeface; import android.util.AttributeSet; import android.view.View;public class RoundProgressBar extends View {private Paint mPaint; //画笔private int roundColor; //圆环的颜色private int roundProgressColor; //圆环进度的颜色private int textColor; //百分比字符串的颜色private float textSize; //百分比字体的大小private float roundWidth;//圆环的宽度private int max;//最大进度private int progerss;//当前进度private boolean textIsDisplayable; //是否显示private int style;//进度风格 public static final int STROKE = 0;public static final int FILL = 1;//第一步重写所以构造方法public RoundProgressBar(Context context){super(context,null);// TODO Auto-generated constructor stub }public RoundProgressBar(Context context, AttributeSet attrs){super(context, attrs);//创建画笔对象mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);// 第二步 初始化自定义属性 initAttrs(context,attrs);}public RoundProgressBar(Context context, AttributeSet attrs,int defStyleAttr){super(context, attrs, defStyleAttr);}//第三步 重写onDraw方法 @Overrideprotected void onDraw(Canvas canvas){ super.onDraw(canvas);//画圆环int center = getWidth()/2; //获取圆形的x坐标int radius =(int)(center-roundWidth/2); //圆环的半径mPaint.setColor(roundColor);//设置圆环的颜色mPaint.setStyle(Paint.Style.STROKE);//空心mPaint.setStrokeWidth(roundWidth);//宽度//画出圆环 canvas.drawCircle(center, center, radius, mPaint);//画进度百分比mPaint.setStrokeWidth(0);mPaint.setColor(textColor);mPaint.setTextSize(textSize);mPaint.setTypeface(Typeface.DEFAULT_BOLD);//设置字体 //计算中间的进度百分比,先转换成float在进行除法运算,不然都为0 int percent = (int)(((float)progerss/ (float)max) * 100);float textWidth = mPaint.measureText(percent+"%");//获取字体宽度if(textIsDisplayable&&percent!=0&&style==STROKE){//画出中间进度值canvas.drawText(percent+"%",center-textWidth/2, center+textSize/2, mPaint);}//画圆弧 mPaint.setStrokeWidth(roundWidth);mPaint.setColor(roundProgressColor);//圆弧进度颜色 RectF oval = new RectF(center-radius, center-radius,center+radius, center+radius);switch (style){case STROKE:mPaint.setStyle(Paint.Style.STROKE);canvas.drawArc(oval,0,360*progerss/max, false,mPaint);//根据进度画圆弧break;case FILL://填充的圆 mPaint.setStyle(Paint.Style.FILL_AND_STROKE);if(progerss!=0){canvas.drawArc(oval, 0, 360*progerss/max,true, mPaint);}break;}}public synchronized int getMax(){return max;}public synchronized void setMax(int max){if(max<0){throw new IllegalArgumentException("max not less than 0");}this.max = max;}public synchronized int getProgress(){return progerss;}public synchronized void setProgress(int progress){if(progress<0){throw new IllegalArgumentException("progress not less than 0");}if(progress>max){this.progerss = max;}if(progress<max){this.progerss = progress;}postInvalidate();//刷新界面调用postInvalidate()能在非UI线程中刷新 }public int getCricleColor() { return roundColor; } public void setCricleColor(int cricleColor) { this.roundColor = cricleColor; } public int getCricleProgressColor() { return roundProgressColor; } public void setCricleProgressColor(int cricleProgressColor) { this.roundProgressColor = cricleProgressColor; } public int getTextColor() { return textColor; } public void setTextColor(int textColor) { this.textColor = textColor; } public float getTextSize() { return textSize; } public void setTextSize(float textSize) { this.textSize = textSize; } public float getRoundWidth() { return roundWidth; } public void setRoundWidth(float roundWidth) { this.roundWidth = roundWidth; } //初始化自定义属性private void initAttrs(Context context,AttributeSet attrs){//获取TypedArray 对象 得到自定义属性TypedArray typedArray = context.obtainStyledAttributes(attrs,R.styleable.RoundProgressBar);//初始化属性roundColor = typedArray.getColor(R.styleable.RoundProgressBar_roundColor,Color.RED );roundProgressColor = typedArray.getColor(R.styleable.RoundProgressBar_roundProgressColor,Color.GREEN);textColor = typedArray.getColor(R.styleable.RoundProgressBar_textColor,Color.GREEN);textSize = typedArray.getDimension(R.styleable.RoundProgressBar_textSize, 15);roundWidth = typedArray.getDimension(R.styleable.RoundProgressBar_roundWidth,5);max = typedArray.getInteger(R.styleable.RoundProgressBar_max,100);textIsDisplayable = typedArray.getBoolean(R.styleable.RoundProgressBar_textIsDisplayable,true);style = typedArray.getInt(R.styleable.RoundProgressBar_style,0);//一定要注意 用完TypedArray 对象 要回收 typedArray.recycle();}}
3、在布局文件中使用自定义View
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:android_custom="http://schemas.android.com/apk/res/com.example.customprogress"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:gravity="center"tools:context=".MainActivity" > <com.example.customprogress.RoundProgressBar android:id="@+id/custom_progress"android:layout_width="80dp"android:layout_height="80dp" android_custom:roundColor="#4f5f6f"android_custom:textColor="#9a32cd"android_custom:roundProgressColor="#f00"android_custom:textIsDisplayable="true"android_custom:roundWidth="10dp"android_custom:textSize="18sp"android_custom:style="STROKE" /></LinearLayout>