首页 > 解决方案 > 如何使用 DashPathEffect 绘制等距虚线

问题描述

目前我正在使用带有硬编码间隔的 DashPathEffect 来绘制一个圆圈,如下所示:

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

但这会在圆圈的开始和结束处产生一个非等距的破折号,如下图所示:

在此处输入图像描述

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

标签: androidgeometry

解决方案


您需要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 = 20,DASH_PORTION = 0.75fGAP_PORTION = 0.25f, 我看到:

在此处输入图像描述

您可以对这些常数使用不同的值来更改将圆切割成多少短划线,或者短划线/间隙相对于彼此有多大(只要DASH_PORTION+GAP_PORTION加起来等于1)。


推荐阅读