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

Kau*_* NP 17 android gradient drawable sweepgradient

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

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

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


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

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

我知道人们可能会认为这不是一个真正的技术问题.但是对于我使用Sweep Gradients或至少知道它们的意思,描述必须来自某个地方.并请提供一些答案的例子在环比其它情况下,扫描的使用.

Att*_*nyi 25

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

在Android API提供3个不同梯度:LinearGradient,RadialGradientSweepGradient.

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

例如:

输出以下代码的图像

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

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) {
        }
    }
}
Run Code Online (Sandbox Code Playgroud)
  • 所以LinearGradientLinear Gradient在Photoshop中,RadialGradientRadial GradientSweepGradientAngular Gradient,在你的第三个参考.我建议首先在图像编辑器中尝试这些(所有流行的图像编辑器都有这些工具),您将很快了解它们的工作原理.

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

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

关于你的结论:

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

我希望这能搞清楚.