SweepGradient的引數

不愛讀書發表於2018-11-16

直奔主題

    /**
     * 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了.

相關文章