android - 如何使用 DashPathEffect 绘制等距虚线
问题描述
目前我正在使用带有硬编码间隔的 DashPathEffect 来绘制一个圆圈,如下所示:
float[] intervals = new float[]{ 3, 18 };
DashPathEffect path = new DashPathEffect(intervals, 0);
paint.setPathEffect(path);
… … … …
canvas.drawCircle(x, y, radius, paint);
但这会在圆圈的开始和结束处产生一个非等距的破折号,如下图所示:
我当然可以手动调整它,但这仅适用于一种特定的设备密度,并在不同的显示密度下再次产生相同的问题。计算等距破折号的公式是什么?
解决方案
您需要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.75f
和GAP_PORTION = 0.25f
, 我看到:
您可以对这些常数使用不同的值来更改将圆切割成多少短划线,或者短划线/间隙相对于彼此有多大(只要DASH_PORTION
+GAP_PORTION
加起来等于1
)。
推荐阅读
- angular - SnackBar 在 HTTPInterceptor 中使用时不显示
- html - 更少的编译器生成空规则
- asp.net-core-mvc - 查询字符串绑定在 RazorPage 上不起作用,即使 SupportsGet = true
- ruby-on-rails - Rails、EC2、Nginx、Unicorn - 新资产不再在生产环境中渲染
- javascript - NodeJS 并发 SFTP 下载导致不同的文件长度
- javascript - 回调函数——如何知道参数内容是什么
- html - Freshdesk/Freshchat 的重音符号问题
- java - 应用于递归算法的动态规划
- url - 替换 URL 的多个部分
- entity-framework-core - 将 Service Fabric Actor 与实体框架持久性结合使用