【问题标题】:NSBezierPath Stroke color is wrongNSBezierPath 描边颜色错误
【发布时间】:2015-09-16 20:54:37
【问题描述】:

我想用NSBezierPathDrawRect中的自定义NSView周围画一个1px宽的边框:

BorderColor.Set();
var path = NSBezierPath.FromRect(theRect);
path.LineWidth = 1;
path.Stroke();

现在BorderColor 设置为NSColor.Gray,在调试时我可以看到它有一个 RGBA 颜色代码:(127,127,127,255)
但是屏幕上出现的 1px 宽的边框会变成这种颜色:(194,194,194,255)
当我将path.LineWidth 设置为 3 时,我可以看到 3 条线,中间的颜色错误 (194..),2 条颜色的翅膀 (135,135,135,255) - 足够接近想要的 (127..)颜色还可以。
当我使用四个 1px 宽的矩形作为边框,Fill 这四个矩形时,我也得到了 (135..) 颜色,这又可以了。

我可以使用这个基于矩形的解决方案,我只是想知道:
有没有办法使用NSBezierPath.Stroke 为 1px 宽的边框实现正确的颜色?

【问题讨论】:

    标签: cocoa colors border xamarin.mac nsbezierpath


    【解决方案1】:

    假设您正确设置了笔触颜色(我们看不到 BorderColor 的设置方式),您可能正在测量屏幕上的颜色值,尤其是对于细线- 可能已经过抗锯齿,所以您看到的不是原始颜色,而是抗锯齿算法的输出。

    将宽度设置为更大的值,例如 10,并测量“斑点”中间的颜色,以确保您没有追逐抗锯齿伪影。

    【讨论】:

    • 谢谢,抗锯齿导致了这个问题。为路径绘图禁用它就可以了:var context = NSGraphicsContext.CurrentContext;context.SaveGraphicsState();context.ShouldAntialias = false;//...Drawing the path...context.RestoreGraphicsState();
    • 这实际上可能不是您想要的 - 确保您的绘图与像素边界对齐。关闭抗锯齿通常不是真正的解决方案,只能在极端情况下使用(但无法想象)。
    • 再次感谢,你是对的,将线的坐标移动0.5px(如here)也可以解决问题。我现在还看到,在坐标移动(或禁用抗锯齿)之前,我的 1px 宽线实际上是 2px 宽。当我将它绘制到视图中间时,我可以看到这一点。我之前只看到过 1px 宽,因为我是在 View 的 Bounds 处绘制的,所以 2. 线被剪掉了。
    • 很高兴听到它有帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-19
    • 2017-09-30
    • 2011-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多