在Android 4.2中,绘制小于一个像素宽度的线条需要使用抗锯齿技术。

3

我想在安卓上画一条非常细的线(厚度小于一个像素)。我正在使用

Paint blackThin = new Paint();
blackThin.setStrokeWidth(0.1f);
blackThin.setColor(Color.BLACK);

初始化画笔对象。

在Android 2.2中,这个功能很好用。但当我在4.2版本(也包括4.1 - 我简单测试过那个版本 - 我没有测试2.2、4.1.2和4.2之外的其他版本)中尝试时,画出的线段不会显示出来。为了在4.2中让它们显示出来,似乎我必须将抗锯齿标志设置为true。(我试过了,线条就出现了)。但我真的不想这样做,因为这会模糊线条。

这是Android中的一个bug吗?除了开启抗锯齿外,还有什么方法可以让它正常工作吗?

编辑:我还使用像素大小为0.9进行了测试,问题是一样的。

感谢您的帮助!


3
如果没有反锯齿技术,你认为0.1像素厚的线会是什么样子? - Matti Virkkunen
在2.2版本中,它运行良好。只是一条非常细的线。另外,0.9与0.1有相同的问题。 - Shdus
3
更可能的是,在2.2版本中它是偶然运作的。可以绘制的最小元素是单个像素,你为什么期望绘制比那更小的东西呢? - robertc
2个回答

3
如果您想要非常细的线,请使用setStrokeWidth(0),正如文档所说:传递0以在发际线模式下描边。 子像素绘制显然需要抗锯齿或其他解决方法。很可能例如在软件渲染中,小于一个像素的线条总是以发际线的形式绘制,但是随着硬件渲染的出现(在Android 4.2中可能自动使用,但不是在2.2中),行为会发生变化,并且许多方便的功能消失。(顺便说一下,这通常是绘图差异和奇怪故障的原因。)

我看了那份文档并尝试了一下,但是使用 setStrokeWidth(0) 给我的结果和使用 setStrokeWidth(1) 的结果一样。我需要设置某个特定的标志才能让它起作用吗?另外,我正在使用模拟器,这可能会影响它吗? - Shdus
我不确定,你应该始终在真实设备上进行测试。你可以尝试禁用硬件渲染(参见文档)进行测试。虽然发际线模式绘制没有被提到是一个问题,但文档可能不完整。另外,为什么你要尝试制作一个没有抗锯齿的亚像素线条,而不是将其设置为1像素并可能调整颜色呢? - Jan Schejbal
很遗憾,我没有直接访问较新设备的权限。但你说得完全正确!我尝试了不同的硬件加速设置组合,但都没有成功。不过还是谢谢你的建议。你在暗示什么?制作一条1像素的线,但使用浅色使其看起来更小? - Shdus
是的,如果您真的想让它看起来更小而不启用抗锯齿(实际上您正在手动执行抗锯齿),那么使用浅色的1像素线条正是您所需要的。但请注意,在具有300+ dpi的xhdpi设备上,1像素线条已经非常非常细了。 - Jan Schejbal

3

如果不使用反锯齿技术,无法绘制小于一个像素宽度的线。

反锯齿技术的整个意义在于计算像素的颜色,如果元素没有完全填充像素(例如只有十分之一像素宽度的线),则可以计算出像素的颜色。

您可以通过绘制较浅的线条来模拟它,但这仍然无法接近实际的反锯齿线条。

例如,请查看此图像:

enter image description here

更改线条颜色无法复制反锯齿结果。

我知道示例中的线条宽度大于1像素,但是相同的原理适用。像素的“黑暗程度”是由填充线条的像素量决定的。因此,纯灰色线条行不通。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接