Sweep Gradient:它是什么以及它的例子

我在Android上遇到了Sweep Gradient,如果它可以让我更好地控制色彩间距和过渡,那么我很感兴趣。 做了快速搜索,发现几乎没有任何关于它!

我发现的唯一一些参考文献(并且它们符合甚至接近正确或全面解释它的标准)如下所示:

  • 在Android上扫描渐变 (只提到要使用的命令 – 这几乎没有价值,因为我现在不知道什么是Sweep Gradient!)
  • android创建cookiesdount与渐变和类似的问题(大多数与环相关 – 使用扫描)
  • Photoshop中的渐变 (讨论Angular Gradient,我认为可能与Sweep渐变有关)
  • 用于在Android中展示Sweep Gradient的Java Android程序 (再次与Rings一起使用)

几乎就是这样。 其他人则相似或贬低。


到目前为止我得出的结论很少(也许是错误的):

  • Sweep Gradient主要用于戒指
  • 它们用于类似的交易,如Angular扫描 (不确定这个),它讨论的事务类似于扫描时钟的手。
  • Linear Gradients 非常相似。 我能想到的唯一一个区别就是使用(比如Rings)。
  • 扫描处理中心 (再次强烈提及时钟理论)

我知道人们可能会认为这不是一个技术问题。 但是对于我使用Sweep Gradients或至少知道它们的意思,描述必须来自某个地方。 请在Rings以外的案例中提供一些使用Sweep的例子。

在此上下文中的单词渐变 (如在许多图形编辑器中,包括Photoshop)指的是多种颜色之间平滑过渡 ,而不是仅使用单一颜色来填充区域。

Android API提供3种不同的渐变: LinearGradientSweepGradientSweepGradient

这些都是Shader子类。 您可以在Paint对象上设置Shader ,然后使用该Paint绘制任何形状。 根据渐变的types,形状将在它们之间填充颜色和过渡。

例如:

输出以下代码的图像

可以使用以下代码生成此图像:

 Bitmap test = Bitmap.createBitmap(640, 200, Bitmap.Config.ARGB_8888); Canvas c = new Canvas(test); { // draw a dark gray background Paint backgroundPaint = new Paint(); backgroundPaint.setARGB(255, 24, 24, 24); c.drawPaint(backgroundPaint); } Path heart = new Path(); { // prepare a heart shape heart.moveTo(110, 175); heart.lineTo(10, 75); RectF leftCircle = new RectF(10, 25, 110, 125); heart.arcTo(leftCircle, 180, 180); RectF rightCircle = new RectF(110, 25, 210, 125); heart.arcTo(rightCircle, 180, 180); heart.close(); } Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG); paint.setTextSize(18f); int[] colors = { 0xFFFFFF88, // yellow 0xFF0088FF, // blue 0xFF000000, // black 0xFFFFFF88 // yellow }; float[] positions = {0.0f, 0.33f, 0.66f, 1.0f}; { // draw the left heart SweepGradient sweepGradient; { // initialize the sweep gradient sweepGradient = new SweepGradient(50, 50, colors, positions); paint.setShader(sweepGradient); } c.drawPath(heart, paint); c.drawText("SweepGradient", 50, 190, paint); } { // draw the middle heart LinearGradient linearGradient; { // initialize a linear gradient linearGradient = new LinearGradient(250, 0, 350, 150, colors, positions, Shader.TileMode.CLAMP); paint.setShader(linearGradient); } heart.offset(210, 0); // move the heart shape to the middle c.drawPath(heart, paint); c.drawText("LinearGradient", 260, 190, paint); } { // draw the right heart RadialGradient radialGradient; { // initialize a linear gradient radialGradient = new RadialGradient(550, 50, 100, colors, positions, Shader.TileMode.CLAMP); paint.setShader(radialGradient); } heart.offset(210, 0); // move the heart shape to the right c.drawPath(heart, paint); c.drawText("RadialGradient", 470, 190, paint); } { // save the bitmap String filename = Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator + "test.png"; FileOutputStream out = null; try { out = new FileOutputStream(filename); test.compress(Bitmap.CompressFormat.PNG, 90, out); } catch (Exception e) { } finally { try { out.close(); } catch (Exception e) { } } } 
  • 所以LinearGradient是Photoshop中的Linear GradientSweepGradientRadial Gradient ,而SweepGradientAngular Gradient ,如第3篇参考文献中所述。 我建议首先在图像编辑器中尝试这些(所有流行的图像编辑器都有这些工具),您将很快了解它们的工作原理。

  • 您也可以在XML drawable中使用这些渐变(如第4个参考中所示),但最多使用3种颜色的限制。

  • SweepGradient ,当提供位置时,0.0点位于3点钟位置,顺时针方向(0.25点位于6点位置,0.5点位于9点位置,0.75点位于12点位置,1.0点位于3点钟位置’时钟)。

关于你的结论:

  • 如您所见, 任何形状都可以使用SweepGradient绘制,而不仅仅是环形。 甚至标签也是使用上面示例中的渐变绘制的。
  • 是的,时钟的手类比是现货。
  • 在使用中, SweepGradientLinearGradient非常相似,除了您不需要提供TileMode ,因为您不能在颜色列表的边界之外运行。
  • 是的,您需要提供中心点的坐标。

我希望这能把它搞清楚。