android 锥形进度条,canvas锥形渐变进度条
时间: 2023-10-09 09:10:36 浏览: 49
实现一个锥形进度条,可以使用Canvas绘制渐变效果。下面是一个简单的示例代码:
```java
public class ConeProgressBar extends View {
private Paint paint;
private int progress = 0;
private int max = 100;
private int width, height;
public ConeProgressBar(Context context) {
super(context);
init();
}
public ConeProgressBar(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
public ConeProgressBar(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init();
}
private void init() {
paint = new Paint();
paint.setAntiAlias(true);
paint.setStyle(Paint.Style.FILL);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
width = MeasureSpec.getSize(widthMeasureSpec);
height = MeasureSpec.getSize(heightMeasureSpec);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
// 计算进度条的角度
float angle = (float) progress / max * 360;
// 创建一个渐变画笔
Shader shader = new SweepGradient(width / 2, height / 2, Color.BLUE, Color.GREEN);
paint.setShader(shader);
// 绘制一个圆形
canvas.drawCircle(width / 2, height / 2, width / 2, paint);
// 绘制一个扇形
paint.setShader(null);
paint.setColor(Color.WHITE);
canvas.save();
canvas.rotate(-90, width / 2, height / 2);
canvas.drawArc(new RectF(0, 0, width, height), 0, angle, true, paint);
canvas.restore();
}
public void setProgress(int progress) {
this.progress = progress;
invalidate();
}
public int getMax() {
return max;
}
public void setMax(int max) {
this.max = max;
}
}
```
在这个示例中,我们创建了一个继承自View的自定义控件ConeProgressBar。在控件的构造函数中,我们初始化了画笔,并设置了画笔的一些基本属性。
在onMeasure()方法中,我们获取了控件的宽度和高度。
在onDraw()方法中,我们首先计算了进度条的角度,然后创建了一个渐变画笔,并使用drawCircle()方法绘制了一个圆形。
接着,我们使用drawArc()方法绘制了一个扇形,表示进度条的进度。在绘制扇形之前,我们还用save()和restore()方法保存和恢复了画布的状态,这样可以保证绘制出来的扇形是竖直方向向上的。
最后,我们提供了setProgress()和setMax()方法,用于设置进度条的进度和最大值。