如何使用DashPathEffect绘制等距破折号

时间:2018-10-12 17:39:00

标签: android geometry

此刻,我正在使用带有硬编码间隔的DashPathEffect绘制下一个圆圈:

float[] intervals = new float[]{ 3, 18 };
DashPathEffect path = new DashPathEffect(intervals, 0); 
paint.setPathEffect(path);
… … … …
canvas.drawCircle(x, y, radius, paint);

但这会在圆的起点和终点产生一个非等长的破折号,如下图所示:

enter image description here

我当然可以手动调整它,但这仅适用于一种特定的设备密度,并且在不同的显示密度下会再次产生相同的问题。 等距破折号的计算公式是什么?

2 个答案:

答案 0 :(得分:0)

您需要 n 破折号加 n 间距以使总长度与圆的周长相同。以下代码假定您已正确确定要使用的center点和radius

double circumference = 2 * Math.PI * radius;
float dashPlusGapSize = (float) (circumference / NUM_DASHES);
intervals[0] = dashPlusGapSize * DASH_PORTION;
intervals[1] = dashPlusGapSize * GAP_PORTION;

DashPathEffect effect = new DashPathEffect(intervals, 0);
paint.setPathEffect(effect);

canvas.drawCircle(center, center, radius, paint);

例如,我使用了NUM_DASHES = 20DASH_PORTION = 0.75fGAP_PORTION = 0.25f,我看到了:

enter image description here

您可以对这些常数使用不同的值,以更改将曲线切成多少个破折号,或破折号/间隙彼此相对的大小(只要添加DASH_PORTIONGAP_PORTION最多1)。

答案 1 :(得分:0)

如果您有不同的身材,可以使用此方法测量自定义路径的长度:

    val measure = PathMeasure(path, false)
    val length = measure.getLength()