使用Core Graphics在Objective-C(IOS)中绘制angular度/angular度/“圆锥形”/“弧光”渐变

我试图绘制一个“锥形”/“弧光”渐变(我不知道什么是正确的术语) (Photoshop称之为“angular度”渐变 – 友好的邻居stackoverflow编辑器)使用Objective-C (IOS),非常像以下线程中显示的图像。

经过几天的search和searchnetworking无济于事,我决定在这里寻求帮助。

关于我在做什么的一点背景。 我的目标是创build一个自定义的UIView,这是一个圆形的进度条,基本上是一个戒指,有点类似于在TweetBot iPhone应用程序中看到的活动指示器(显示当你拖动刷新,这可以在这里看到,在17左右-18秒,在iPhone屏幕上方)。 我想要进度指示器(圆环的填充)是一个简单的两个颜色渐变,可以通过编程设置,视图可以resize。

用“跟随”圆弧的渐变填充圆环形状是我卡住的地方。 我从谷歌search得到的答案,阅读苹果的梯度上的核心graphics文档和searchSO是要么径向渐变或线性/轴向渐变,这不是我想要实现的。

上面链接的线程build议使用预先制作的图像,但这不是一个选项,因为渐变的颜色应该是可设置的,视图应该可以resize,进度条的填充并不总是100%显着将成为如上图所示的渐变状态)。

我想出的唯一解决scheme是“手动”绘制渐变,所以如果不使用CGGradientRef ,请在圆形path中剪裁单个纯色填充的渐变的小片。 我不知道当这个栏被animation时它的performance如何,应该不是那么糟糕,但这可能是一个问题。

所以我的第一个问题:

Objective-C(IOS)中绘制锥形/弧形渐变的方法比我提出的解决scheme更容易/不同吗?

第二个问题:

如果我必须在我的视图中使用我提出的解决scheme手动绘制渐变,那么我如何确定或计算渐变的每个颜色“切片”的值(HEX或RGBA)试图画,如下图所示。

(不能链接图像) 渐变片图

上面链接的线程build议使用预先制作的图像,但这不是一个选项,因为渐变的颜色应该是可设置的,视图应该可以resize,进度条的填充并不总是100%显着将成为如上图所示的渐变状态)。

不是问题!

使用另一个问题(或更大的版本,如果您需要)的非常黑白的图像,按以下方式:

  1. 剪切到任何想要绘制渐变的形状。
  2. 用渐变结束处的颜色填充。
  3. 使用黑白渐变图像作为蒙版。
  4. 在渐变的开始处填充颜色。

您可以通过旋转蒙版图像来旋转渐变。

这只支持在每个极端的颜色渐变最简单的情况下, 它不缩放到三种或更多种颜色,不支持exception梯度停止定位。

看起来像一个像素着色器的工作。 我记得看到一个Quartz Composer的例子,模拟雷达扫描,并使用像素着色器产生像你所描述的效果。

编辑:

find了。 这个着色器是由Peter Graffignino写的:

 kernel vec4 radarSweep(sampler image, __color color1,__color color2, float angle, vec4 rect) { vec4 val = sample(image, samplerCoord(image)); vec2 locCart = destCoord(); float theta, r, frac, angleDist; locCart.x = (locCart.x - rect.z/2.0) / (rect.z/2.0); locCart.y = (locCart.y - rect.w/2.0) / (rect.w/2.0); // locCart is now normalized theta = degrees(atan(locCart.y, locCart.x)); theta = (theta < 0.0) ? theta + 360.0 : theta; r = length(locCart); angleDist = theta - angle; angleDist = (angleDist < 0.0) ? angleDist + 360.0 : angleDist; frac = 1.0 - angleDist/360.0; // sum up 3 decaying phosphors with different time constants val = val*exp2(-frac/.005) + (val+.1)*exp2(-frac/.25)*color1 + val*exp2(-frac/.021)*color2; val = r > 1.0 ? vec4(0.0, 0.0,0.0,0.0) : val; // constrain to circle return val; } 

仅供参考:这里也是一个很好的使用Quartz绘图创build圆形进度条的教程。

http://www.turnedondigital.com/blog/quartz-tutorial-how-to-draw-in-quartz/