在Android开发中不可避免的需要自定义一些控件,我在开发过程中需要重写一个ProgressBar来实现需要的特效。
由于注释的比价详细,我就直接上代码,不懂的,在翻一些资料,都很容易理解:
下面这个类就是我们重写的ProgressBar:
package com.jinbi.app.view;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Paint.Style;
import android.graphics.RectF;
import android.util.AttributeSet;
import android.view.View;
public class CircleProgressBar extends View {
private float maxProgress;
private float progress;
private int progressStrokeWidth;
private RectF oval; //画图所在的矩形区域
private Paint paint;
public CircleProgressBar(Context context, AttributeSet attrs) {
super(context, attrs);
oval = new RectF();
paint = new Paint();
maxProgress = 100;
progress = 0;
progressStrokeWidth = 47;
}
/**
* @param context 上下文对象
* @param attrs
* @param progress
* @param maxProgress 进度条最大值
* @param progressStrokeWidth 进度条宽度
*/
public CircleProgressBar(Context context, AttributeSet attrs,float progress,float maxProgress,int progressStrokeWidth) {
super(context, attrs);
this.maxProgress = maxProgress;
this.progress = progress;
this.progressStrokeWidth = progressStrokeWidth;
oval = new RectF();
paint = new Paint();
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
int width = this.getWidth();
int height = this.getHeight();
if (width != height){
int min = Math.min(width, height);
width = min;
height = min;
}
paint.setAntiAlias(true); //设置画笔为抗锯齿
paint.setColor(Color.WHITE); //设置画笔颜色
canvas.drawColor(Color.TRANSPARENT); //白色背景
paint.setStrokeWidth(progressStrokeWidth); //线宽
paint.setStyle(Style.STROKE);
oval.left = progressStrokeWidth; //左上角x
oval.top = progressStrokeWidth; //左上角y
oval.right = width - progressStrokeWidth; //左下角x
oval.bottom = height - progressStrokeWidth; //右下角y
paint.setColor(Color.rgb(226, 226, 226));
canvas.drawArc(oval, -90, 360, false, paint);//绘制进度条,这里是蓝色
canvas.drawArc(oval, -90, 360, false, paint);//绘制白色圆圈,即进度条背景
paint.setColor(Color.rgb(38, 152, 200));
canvas.drawArc(oval, -90, ((float)progress/maxProgress)*360, false, paint);//绘制进度条,这里是蓝色
}
public float getMaxProgress(){
return maxProgress;
}
public void setMaxProgress(int maxProgress){
this.maxProgress = maxProgress;
}
public void setProgress(int maxProgress){
this.progress = progress;
}
public void setProgressNotInUiThread(float progress,float maxProgress){
this.progress = progress;
this.maxProgress = maxProgress;
this.postInvalidate();
}
}
在需要用到此控件的布局文件中添加:
<com.jinbi.app.view.CircleProgressBar
android:layout_marginLeft="25dp"
android:id="@+id/circleProgressbar"
android:layout_width="268dp"
android:layout_height="268dp"
android:clickable="true"/>
这样控件就被添加到布局中了。
最后通过JAVA代码就可以得到此控件了:
final CircleProgressBar progressBar =
(CircleProgressBar)findViewById(R.id.circleProgressbar);
控件的显示图形如下,随着点击就可以实现精度效果了,由于我是项目直接部署到手机上了,不好截图,以后有时间再补上运行时的效果图。