为什么 Paint.ANTI_ALIAS_FLAG 在 Canvas 上的同一位置绘图时似乎不起作用?

Why Paint.ANTI_ALIAS_FLAG does not seem to work when drawing at same place on Canvas?

尝试使用 android Canvas.

在同一位置多次绘制时,抗锯齿出现问题

首先,我正在初始化 paint = new Paint(Paint.ANTI_ALIAS_FLAG),然后将笔划上限设置为 Paint.Cap.ROUND

然后,如果我调用 canvas.drawPoint(x, y, paint) 一次会导致以下结果:

多次调用 canvas.drawPoint(x, y, paint) 时(本例中为 100 次)导致:

我在 GitHub 上用最少的代码创建了一个示例 运行:android-canvas-antialias

我注意到如果我以一定的距离绘制点,抗锯齿似乎会按预期工作(第一张图片)。但是用很小的偏移绘制它会导致同样的抗锯齿问题(第二张图片)。

在同一位置绘制点时,是否需要进行任何设置才能使其正常工作?或者我可能根本没有在同一个地方绘图(或者偏移量很小)?

编辑:真正的问题是因为我正在尝试绘制宽度可变的线段。请参阅 git 存储库中的 MainActivity.drawSegment

它工作正常。抗锯齿是指形状的边缘是半透明的。当您乘以形状时,半透明像素变得不透明,您会得到 "ragged" 条边。

解决办法是不这样做。

我认为这不是问题,我的意思是,它本身就是一个错误。我想即使可以轻松解决。

圆圈边缘的像素是用一些 alpha 绘制的,例如具有 25% alpha 的红色像素如果用更多 3 个具有相同 alpha 的像素覆盖它,您将获得 100% 的红色像素。

一种解决方法是管理所有创建的形状并检查它们中的一些是否具有相同的大小和位置(可能还有颜色),然后只绘制其中一个。

下面的 link 解释了抗锯齿的工作原理,可能会有所帮助。

http://web.cs.wpi.edu/~matt/courses/cs563/talks/antialiasing/methods.html