绘制圆弧需要用到 Canvas 的
// oval 为 RectF 类型,即圆弧显示区域 // startAngle 和 sweepAngle 均为 float 类型,分别表示圆弧起始角度和圆弧度数。3点钟方向为0度,顺时针递增 // 如果 startAngle < 0 或者 > 360,则相当于 startAngle % 360 // useCenter:如果为 true 时,在绘制圆弧时将圆心包括在内,通常用来绘制扇形 // 绘制圆弧的画笔 drawArc(RectF oval, float startAngle, float sweepAngle, boolean useCenter, Paint paint);为了方便计算,绘制圆弧的时候使用了 Canvas 的 rotate() 方法,对坐标系进行了旋转
private void drawArc(Canvas canvas) { // 绘制背景圆弧 // 从进度圆弧结束的地方开始重新绘制,优化性能 canvas.save(); float currentAngle = mSweepAngle * mPercent; canvas.rotate(mStartAngle, mCenterPoint.x, mCenterPoint.y); // +2 是因为绘制的时候出现了圆弧起点有尾巴的问题 canvas.drawArc(mRectF, currentAngle, mSweepAngle - currentAngle + 2, false, mBgArcPaint); canvas.drawArc(mRectF, 2, currentAngle, false, mArcPaint); canvas.restore(); }恩,圆环已经绘制完成,那么接下来就是实现圆环的渐变,这里使用 SweepGradient 类。SweepGradient 可以实现从中心放射性渐变的效果,如下图:
SweepGradient 类有两个构造方法,
/** * @param cx 渲染中心点x坐标 * @param cy 渲染中心点y坐标 * @param colors 围绕中心渲染的颜色数组,至少要有两种颜色值 * @param positions 相对位置的颜色数组,可为null, 若为null,可为null,颜色沿渐变线均匀分布。一般不需要设置该参数 / public SweepGradient(float cx, float cy, int[] colors, float[] positions) /** * @param cx 渲染中心点x坐标 * @param cy 渲染中心点y坐标 * @param color0 起始渲染颜色 * @param color1 结束渲染颜色 / public SweepGradient(float cx, float cy, int color0, int color1)