我正试图在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 :(得分:3)
如果您想要一条非常细的线条,请使用setStrokeWidth(0)
,documentation说Pass 0 to stroke in hairline mode.
子像素绘制显然需要Anitaliasing或其他解决方法。很可能是这样的,例如使用软件渲染时,一个像素以下的线条总是被绘制成细线,但是通过硬件渲染(可以在Android 4.2中自动使用而不是在2.2中),行为会发生变化,许多方便的功能也会消失。 (这通常是绘制差异和奇怪故障的原因,顺便说一句。)
答案 1 :(得分:3)
如果没有消除锯齿,则无法在width
中绘制小于一个像素的行。
抗锯齿的重点是计算像素的颜色,如果一个元素没有完全填满像素(就像一条只有十分之一像素宽度的线)。
你可以通过绘制一条较轻的线来模拟它,但仍然不会接近实际的抗锯齿线。
看看这张图片,例如:
通过改变线条的颜色来复制抗锯齿结果真的不可能。
我意识到示例中的行是>宽度为1像素,但原则相同。由于用线填充了多少像素,计算像素的“暗度”。因此,灰色实线不起作用。