沿路径使用渐变

Ste*_*ley 4 graphics shader android gradient path

我正在尝试使用Android Path类创建“发光”效果。但是,渐变不会被扭曲以适合路径。相反,它只是在其“上方”显示并剪切到路径的笔划。使用方形路径,下图显示了我的意思:

路径渐变失败

相反,应该看起来像这样:

在此处输入图片说明

换句话说,渐变遵循路径,并且特别是根据CornerPathEffect中设置的半径环绕拐角。

这是代码的相关部分:

paint = new Paint();
paint.setStyle(Style.STROKE);
paint.setStrokeWidth(20);
paint.setAntiAlias(true);
LinearGradient gradient = new LinearGradient(30, 0, 50, 0,
    new int[] {0x00000000, 0xFF0000FF, 0x00000000}, null, Shader.TileMode.MIRROR);
paint.setShader(gradient);
PathEffect cornerEffect = new CornerPathEffect(10);
paint.setPathEffect(cornerEffect);
canvas.drawPath(boxPath, paint);
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?


另一种选择是在定义笔划宽度时获得“软边笔刷”效果。我已经对BlurMaskFilters进行了实验,但是它们提供了统一的模糊效果,而不是从不透明到透明的过渡。有人知道这是否可能吗?

cod*_*er1 5

用软笔刷位图绘制怎么样?使用诸如Photoshop之类的图像编辑软件制作不透明的,径向向外逐渐减小的软圆形画笔。另存为可绘制对象,将其加载到位图中,然后沿路径均匀地绘制。用白色画笔制作位图。这样,您可以使用PorterDuffColorFilter简单地将给定的颜色(此处为蓝色)乘以位图。

brush1=BitmapFactory.decodeResource(getResources(), R.drawable.brush_custom_one);
//This contains radially decreasing opacity brush
porter_paint.setColorFilter(new PorterDuffColorFilter(paint.getColor(), Mode.MULTIPLY));
for (int i=1;i<matrix.size();i++) {
//matrix contains evenly spaced points along path 
Point point = matrix.get(matrix.get(i));
canvas.drawBitmap(brush1, point.x,point.y, porter_paint);}
Run Code Online (Sandbox Code Playgroud)

使用的画笔是(在那儿): 用过的刷子 最终结果是: 最后结果


Ste*_*ley 3

事实证明,有一种愚蠢而明显的方法可以做到这一点。只需重复使用相同的路径,并在每个绘图通道上调整描边宽度和 Alpha。示例代码:

float numberOfPasses = 20;
float maxWidth = 15;
for (float i = 0; i <= numberOfPasses; i++){
    int alpha = (int) (i / numberOfPasses * 255f);
    float width = maxWidth * (1 - i / numberOfPasses);

    paint.setARGB(alpha, 0, 0, 255);
    paint.setStrokeWidth(width);
    canvas.drawPath(path, paint);
}
Run Code Online (Sandbox Code Playgroud)

请参阅下面的结果示例。左侧路径是使用此方法绘制的,为了进行比较,右侧路径是使用 maxWidth 和 255 alpha 在单笔划中绘制的。

绘图结果示例

这主要起作用。有两个问题:

  • 渐变并不像应有的那么平滑。这是因为每一次绘制都会覆盖前一次,导致 alpha 建立得太快,在最后一次绘制之前就达到 255。对这条线进行一些实验int alpha = (int) (i / numberOfPasses * 125f);(注意更改为 125f 而不是 255f)会有所帮助。

  • 这条路看起来像是在拐角内侧被“切割”过的。可能是应用的一些结果CornerPathEffect