考虑到圆弧设置单色和渐变的区别,即单色只需要提供一种色值,而渐变至少需要提供两种色值。可以有以下几种解决方案:
这里选用第三种方案,实现如下:
<!-- 圆形进度条 --> <declare-styleable name="CircleProgressBar"> <!-- 圆弧颜色, --> <attr name="arcColors" format="color|reference" /> </declare-styleable> <!-- colors.xml --> <color name="green">#00FF00</color> <color name="blue">#EE9A00</color> <color name="red">#EE0000</color> <!-- 渐变颜色数组 --> <integer-array name="gradient_arc_color"> <item>@color/green</item> <item>@color/blue</item> <item>@color/red</item> </integer-array> <!-- 布局文件中使用 --> <!-- 使用渐变 --> <com.littlejie.circleprogress.DialProgress android:id="@+id/dial_progress_bar" android:layout_width="300dp" android:layout_height="300dp" app:arcColors="@array/gradient_arc_color" /> <!-- 使用单色 --> <com.littlejie.circleprogress.DialProgress android:id="@+id/dial_progress_bar" android:layout_width="300dp" android:layout_height="300dp" app:arcColors="@color/green" />代码中读取 xml 中配置:
int gradientArcColors = typedArray.getResourceId(R.styleable.CircleProgressBar_arcColors, 0); if (gradientArcColors != 0) { try { int[] gradientColors = getResources().getIntArray(gradientArcColors); if (gradientColors.length == 0) {//如果渐变色为数组为0,则尝试以单色读取色值 int color = getResources().getColor(gradientArcColors); mGradientColors = new int[2]; mGradientColors[0] = color; mGradientColors[1] = color; } else if (gradientColors.length == 1) {//如果渐变数组只有一种颜色,默认设为两种相同颜色 mGradientColors = new int[2]; mGradientColors[0] = gradientColors[0]; mGradientColors[1] = gradientColors[0]; } else { mGradientColors = gradientColors; } } catch (Resources.NotFoundException e) { throw new Resources.NotFoundException("the give resource not found."); } }带刻度进度条
前面,详细讲了 CircleProgress 的绘制思路,接下来讲 DialProgress。
实话说,DialProgress 与 CircleProgress 的实现极其相似,因为两者之间其实就差了一个刻度,但考虑到扩展以及类职责的单一,所以将两者分开。