android圆形百分比,android_自定义View_圆形百分比显示

党博超
2023-12-01

布局中使用

布局文件添加命名空间xmlns:attr="http://schemas.android.com/apk/res/.ui"

android:layout_centerHorizontal="true"

android:id="@+id/flow_percent_pie"

android:layout_width="100dp"

android:layout_height="100dp"

attr:roundProgressBarWidth="6dp"

attr:roundColor="@color/gray"

attr:textSize="12dp"

attr:roundProgressColor="#68c630"

attr:textColor="#68c630"

attr:textIsDisplayable="true"

/>

自定义属性

自定义实现

public class RoundProgressBar extends View {

/**

* 画笔对象的引用

*/

private Paint paint;

/**

* 圆环的颜色

*/

private int roundColor;

/**

* 圆环进度的颜色

*/

private int roundProgressColor;

/**

* 中间进度百分比的字符串的颜色

*/

private int textColor;

private String text;

/**

* 中间进度百分比的字符串的字体

*/

private float textSize;

/**

* 圆环的宽度

*/

private float roundWidth;

/**

* 最大进度

*/

private int max;

/**

* 当前进度

*/

private int progress;

/**

* 是否显示中间的进度

*/

private boolean textIsDisplayable;

/**

* 进度的风格,实心或者空心

*/

private int style;

public static final int STROKE = 0;

public static final int FILL = 1;

public RoundProgressBar(Context context) {

this(context, null);

}

public RoundProgressBar(Context context, AttributeSet attrs) {

this(context, attrs, 0);

}

public RoundProgressBar(Context context, AttributeSet attrs, int defStyleAttr) {

super(context, attrs, defStyleAttr);

TypedArray mTypedArray = context.obtainStyledAttributes(attrs,

R.styleable.RoundProgressBar);

//获取自定义属性和默认值

roundColor = mTypedArray.getColor(R.styleable.RoundProgressBar_roundColor, Color.RED);

roundProgressColor = mTypedArray.getColor(R.styleable.RoundProgressBar_roundProgressColor, Color.GREEN);

textColor = mTypedArray.getColor(R.styleable.RoundProgressBar_textColor, Color.GREEN);

textSize = mTypedArray.getDimension(R.styleable.RoundProgressBar_textSize, 15);

roundWidth = mTypedArray.getDimension(R.styleable.RoundProgressBar_roundProgressBarWidth, 5);

max = mTypedArray.getInteger(R.styleable.RoundProgressBar_maxProgressBar, 100);

textIsDisplayable = mTypedArray.getBoolean(R.styleable.RoundProgressBar_textIsDisplayable, true);

style = mTypedArray.getInt(R.styleable.RoundProgressBar_style, 0);

mTypedArray.recycle();

init(context);

}

private void init(Context context) {

paint = new Paint();

}

@Override

protected void onDraw(Canvas canvas) {

super.onDraw(canvas);

/**

* 画最外层的大圆环

*/

int centre = getWidth()/2; //获取圆心的x坐标

int radius = (int) (centre - roundWidth/2); //圆环的半径

paint.setColor(roundColor); //设置圆环的颜色

paint.setStyle(Paint.Style.STROKE); //设置空心

paint.setStrokeWidth(roundWidth); //设置圆环的宽度

paint.setAntiAlias(true);  //消除锯齿

canvas.drawCircle(centre, centre, radius, paint); //画出圆环

/**

* 画进度百分比

*/

paint.setStrokeWidth(0);

paint.setColor(textColor);

paint.setTextSize(textSize);

paint.setTypeface(Typeface.DEFAULT_BOLD); //设置字体

int percent = (int)(((float)progress / (float)max) * 100);  //中间的进度百分比,先转换成float在进行除法运算,不然都为0

float textWidth = paint.measureText("500M");   //测量字体宽度,我们需要根据字体的宽度设置在圆环中间

if(textIsDisplayable && percent != 0 && style == STROKE){

canvas.drawText(text.substring(0,2), centre - textWidth , centre - textSize/2, paint); //画出进度百分比

canvas.drawText(text.substring(2), centre - textWidth/2, centre + textSize/2, paint); //画出进度百分比

}

/**

* 画圆弧 ,画圆环的进度

*/

//设置进度是实心还是空心

paint.setStrokeWidth(roundWidth); //设置圆环的宽度

paint.setColor(roundProgressColor);  //设置进度的颜色

RectF oval = new RectF(centre - radius, centre - radius, centre

+ radius, centre + radius);  //用于定义的圆弧的形状和大小的界限

switch (style) {

case STROKE:{

paint.setStyle(Paint.Style.STROKE);

canvas.drawArc(oval, 180, 360 * progress / max, false, paint);  //根据进度画圆弧

break;

}

case FILL:{

paint.setStyle(Paint.Style.FILL_AND_STROKE);

if(progress !=0)

canvas.drawArc(oval, 0, 360 * progress / max, true, paint);  //根据进度画圆弧

break;

}

}

}

/**

* 设置进度,此为线程安全控件,由于考虑多线的问题,需要同步

* 刷新界面调用postInvalidate()能在非UI线程刷新

* @param progress

*/

public synchronized void setProgress(int progress) {

if(progress 

throw new IllegalArgumentException("progress not less than 0");

}

if(progress > max){

progress = max;

}

if(progress <= max){

this.progress = progress;

postInvalidate();

}

}

public void setText(String text){

this.text = text;

postInvalidate();

}

}

 类似资料: