之前有一个项目需要这样的一个控件:
自然想到用SweepGradient来渲染这个半环,参考了下官方的ColorPickerDemo,发现其中是一个完整的圆环,并不需要指定SweepGradient 的第四个参数positions.
于是查阅了API和stackoverflow,弄清了positions的用法
public SweepGradient (float cx, float cy, int[] colors, float[] positions)
Parameters
cx float: The x-coordinate of the center 圆心的X坐标
cy float: The y-coordinate of the center 圆心的Y坐标
colors int: The colors to be distributed between around the center. There must be at least 2 colors in the array.
着色器的颜色数组
positions float: 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.
positions数组指定颜色在圆上的渲染分布,守护彩虹的任务就交给它了。
假如要绘制完整的圆,positions指定为null就可以了,默认会按照颜色数组的顺序帮你渲染。
假如是像我要做的控件,是有缺口的圆,则需要我们去指定各个颜色的位置。
渲染的方向是顺时针,位置从0开始,到1结束,而且数组要呈单调递增,不然可能会有可怕的后果。。
所以看回上面的控件,颜色数组为{"绿色","黄色","红色","紫色","蓝色"},
绿色在180度,所以他对应的位置参数是0.5 (顺时针算)
以此类推,黄色 225度,0.625
红色 270度,0.75
紫色 315度,0.875
蓝色 360度,1
所以对应的positions数组就是{ 0.5f, 0.625f, 0.75f, 0.875f, 1f }
至此,着色器设置完毕