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

时间:2015-08-11 13:53:09

标签: android canvas antialiasing

尝试使用android Canvas在同一位置绘制多次时出现反别名问题。

首先我初始化paint = new Paint(Paint.ANTI_ALIAS_FLAG),然后将笔画上限设为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

2 个答案:

答案 0 :(得分:5)

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

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

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

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

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

答案 1 :(得分:4)

它正常工作。消除锯齿是指形状的边缘是半透明的。当你将形状相乘时,半透明的像素会变得不透明,你就会变得粗糙"边缘。

解决方案不是这样做的。