android - 为什么 Paint.ANTI_ALIAS_FLAG 在 Canvas 上的同一个地方绘图时似乎不起作用?

标签 android canvas antialiasing

尝试使用 android Canvas 在同一位置多次绘制时,抗锯齿出现问题。

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

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

enter image description here

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

enter image description here

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

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

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

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

最佳答案

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

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

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

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

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

关于android - 为什么 Paint.ANTI_ALIAS_FLAG 在 Canvas 上的同一个地方绘图时似乎不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31943730/

相关文章:

javascript - 如何让 GSAP 时间线识别在其中创建的元素?

java - 有什么方法可以检测窗口在哪个监视器上吗?

ios - 在 iPad/iOS 上启用 4x MSAA 抗锯齿时出现伪影

java - 将 FutureTask 转换为 ScheduledFuture

android - 在单个 APK 中定位多个 API

android - 为什么 setBitmap 在 ICS 中似乎不起作用?

图像上的 Java 文本

android - 在没有客户端 SDK 的情况下使用 GCM/Firebase

android viewpager 适配器和 NullPointerException

javascript - 为什么调用clearRect()后无法写入 Canvas ?