2

Pathフェード(不透明度または太さ)線で描画するにはどうすればよいですか? このようなもの。

フェードの例

LinearGradientのシェーダーがあることは知っていますが、に沿って曲がるPaintことはありません。Path

考えられる解決策の 1 つは、 に沿ってポイントを取得Pathし、セグメントを通じて自分でそれを描画することです。しかし、そのための方法も見つかりませんでした。

4

1 に答える 1

1

次のコードを思いつきました。最も重要なことはPathMeasuregetPosTan()メソッドです。

if (getGesturePath() != null) {
    final short steps = 150;
    final byte stepDistance = 5;
    final byte maxTrailRadius = 15;
    pathMeasure.setPath(getGesturePath(), false);
    final float pathLength = pathMeasure.getLength();
    for (short i = 1; i <= steps; i++) {
        final float distance = pathLength - i * stepDistance;
        if (distance >= 0) {
            final float trailRadius = maxTrailRadius * (1 - (float) i / steps);
            pathMeasure.getPosTan(distance, pathPos, null);
            final float x = pathPos[0] + RandomUtils.nextFloat(0, 2 * trailRadius) - trailRadius;
            final float y = pathPos[1] + RandomUtils.nextFloat(0, 2 * trailRadius) - trailRadius;
            paint.setShader(new RadialGradient(
                    x,
                    y,
                    trailRadius > 0 ? trailRadius : Float.MIN_VALUE,
                    ColorUtils.setAlphaComponent(Color.GREEN, random.nextInt(0xff)),
                    Color.TRANSPARENT,
                    Shader.TileMode.CLAMP
            ));
            canvas.drawCircle(x, y, trailRadius, paint);
        }
    }
}
于 2016-11-03T11:56:54.220 に答える