【问题标题】:Drawing line less than one pixel thick requires anti-aliasing in Android 4.2在 Android 4.2 中绘制小​​于 1 像素粗的线需要抗锯齿
【发布时间】:2013-01-01 23:29:44
【问题描述】:

我正在尝试在 android 中绘制一条非常细的线(小于一个像素厚)。我正在使用

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 中的错误吗?除了打开抗锯齿之外,我还能做些什么让它工作?

编辑:我也用 0.9 的像素大小对此进行了测试,问题是一样的。

感谢您的帮助!

【问题讨论】:

  • 如果没有抗锯齿,0.1 像素粗的线条会是什么样子?
  • 在 2.2 版中,它工作正常。这只是一条非常细的线。顺便说一句,0.9 和 0.1 有同样的问题。
  • 更有可能:在 2.2 中它意外工作。可以绘制的最小的东西是单个像素,为什么您期望绘制的东西小于那个?

标签: android canvas paint antialiasing stroke


【解决方案1】:

如果您想要一条非常细的线,请使用setStrokeWidth(0),正如documentation 所说的Pass 0 to stroke in hairline mode.

亚像素绘图显然需要消除锯齿或其他变通方法。很有可能,例如使用软件渲染,低于 1 个像素的线总是被绘制为细线,但是使用硬件渲染(在 Android 4.2 中可能会自动使用,但在 2.2 中不会),行为会发生变化,并且许多方便的功能会消失。 (顺便说一句,这通常是造成差异和奇怪故障的原因。)

【讨论】:

  • 我看到了该文档并尝试了它,但使用 setStrokeWidth(0) 得到的结果与使用 setStrokeWidth(1) 时的结果相同。我是否必须设置某个标志才能使其正常工作?另外,我正在使用模拟器。这会影响它吗?
  • 我不确定,您也应该始终在真实设备上进行测试。您可以尝试禁用硬件渲染(参见doc)进行测试。虽然没有提到发际线模式绘图是一个问题,但文档可能不完整。另外,您为什么要尝试制作没有抗锯齿的亚像素线,而不是将其设置为 1 px 并可能调整颜色?
  • 很遗憾,我无法直接访问更新的设备。但你是 100% 正确的!我尝试使用不同的硬件加速设置组合但没有成功。不过,谢谢你的想法。你在暗示什么?制作一条 1 px 的线,但使用较浅的颜色以使其看起来更小?
  • 是的,如果你真的想在不启用抗锯齿的情况下让它看起来更小(你基本上是手动进行抗锯齿),那么颜色较浅的 1px 线条正是你所需要的。但是,考虑到 300+ dpi 的 xhdpi 设备上的 1px 线已经非常非常细了。
【解决方案2】:

如果没有抗锯齿,您不能在width 中绘制小​​于一个像素的线条。

抗锯齿的全部意义在于计算一个像素的颜色,如果一个元素没有完全填满像素(就像一条只有十分之一像素宽度的线)。

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

看看这张图片,例如:

真的不可能通过改变线条的颜色来复制消除锯齿的结果。

我意识到示例中的线条宽度 > 1 像素,但同样的原理也适用。像素的“暗度”是根据有多少像素被线条填充来计算的。因此,灰色实线不起作用。

【讨论】:

    猜你喜欢
    • 2015-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-19
    • 2011-05-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多