Android 写一个自定义View ,圆形进度条
时间: 2024-01-24 22:05:33 浏览: 31
好的,下面是一个简单的圆形进度条的自定义View实现:
```java
public class CircleProgressBar extends View {
private float mProgress = 0; // 当前进度值
private float mMax = 100; // 最大进度值
private int mCircleWidth = 10; // 圆环宽度
private int mCircleColor = Color.GRAY; // 圆环颜色
private int mProgressColor = Color.BLUE; // 进度条颜色
private Paint mPaint;
public CircleProgressBar(Context context) {
super(context);
init();
}
public CircleProgressBar(Context context, AttributeSet attrs) {
super(context, attrs);
TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.CircleProgressBar);
mCircleWidth = ta.getDimensionPixelSize(R.styleable.CircleProgressBar_circleWidth, 10);
mCircleColor = ta.getColor(R.styleable.CircleProgressBar_circleColor, Color.GRAY);
mProgressColor = ta.getColor(R.styleable.CircleProgressBar_progressColor, Color.BLUE);
ta.recycle();
init();
}
private void init() {
mPaint = new Paint();
mPaint.setAntiAlias(true);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
int centerX = getWidth() / 2;
int centerY = getHeight() / 2;
int radius = getWidth() / 2 - mCircleWidth / 2;
// 画圆环
mPaint.setColor(mCircleColor);
mPaint.setStrokeWidth(mCircleWidth);
mPaint.setStyle(Paint.Style.STROKE);
canvas.drawCircle(centerX, centerY, radius, mPaint);
// 画进度条
mPaint.setColor(mProgressColor);
mPaint.setStrokeWidth(mCircleWidth);
mPaint.setStyle(Paint.Style.STROKE);
RectF rectF = new RectF(centerX - radius, centerY - radius, centerX + radius, centerY + radius);
canvas.drawArc(rectF, -90, 360 * mProgress / mMax, false, mPaint);
}
public void setProgress(float progress) {
mProgress = progress;
invalidate();
}
public void setMax(float max) {
mMax = max;
invalidate();
}
}
```
其中,我们可以设置圆环的宽度、圆环颜色、进度条颜色等属性。在onDraw()方法中,我们先画出圆环,然后再画出进度条,进度条的弧度根据当前进度值和最大进度值计算得出。
使用时,可以在布局文件中添加如下代码:
```xml
<com.example.customview.CircleProgressBar
android:id="@+id/circle_progress_bar"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:circleColor="#FFA500"
app:circleWidth="20dp"
app:progressColor="#00BFFF" />
```
然后在代码中设置进度值即可:
```java
CircleProgressBar circleProgressBar = findViewById(R.id.circle_progress_bar);
circleProgressBar.setMax(100);
circleProgressBar.setProgress(50);
```