直奔主題
/**
* A Shader that draws a sweep gradient around a center point.
*
* @param cx The x-coordinate of the center
* @param cy The y-coordinate of the center
* @param colors The colors to be distributed between around the center.
* There must be at least 2 colors in the array.
* @param positions May be NULL. The relative position of
* each corresponding color in the colors array, beginning
* with 0 and ending with 1.0. If the values are not
* monotonic, the drawing may produce unexpected results.
* If positions is NULL, then the colors are automatically
* spaced evenly.
*/
public SweepGradient(float cx, float cy,
@NonNull @ColorInt int colors[], @Nullable float positions[]) {
//..........
}
複製程式碼
這裡我們只說第四個引數float positions[]
.
這個引數的意思是,你繪製的幾種漸變色(也就是第三個引數)在繪製的圓環上的區域.註釋上說這個引數可為null.如果為null,那麼預設從0°開始繪製顏色,到360°結束.不管你的起始角度(>=0°)和結束角度(<=360°)是多少,都是按照這個邏輯去繪製.並且每種顏色在圓弧上是均勻分佈的.
假如要繪製3種顏色,那麼繪製的區域分別是0°~120°,120°~240°,240°~360°. 如果起始角度在0°~120°之間,那麼圓環上會顯示第一種顏色,如果起始角度超過了120°,那麼圓環上就不會顯示第一種顏色了,以此類推.
假如,給定一段圓弧,顯示全部的漸變色,該如何去做?
設定起始角度大於0°
float startAngle
複製程式碼
圓弧角度小於360°
float sweepAngle
複製程式碼
繪製顏色
int colors[]
複製程式碼
既然要全部顯示漸變色,那麼這段圓弧就要被均分.均分後的每段圓弧的中心位置(相對於360°圓弧的位置)就是引數float positions[]
的元素.(實際測試是這樣的,如有不對的,煩請指正).
那麼
float divAngle = sweepAngle/colors[].length();
float start = startAngle/360;
colors[0] = start + divAngle/2;
colors[1] = start + 3 * divAngle / 2;
...
colors[n-1] = start + (2*n+1) * divAngle / 2;
複製程式碼
這樣就ok了.