setNeedsDisplay不够快(这样做的正确方法是什么?)

时间:2014-02-02 19:41:25

标签: macos cocoa drawing

我正在尝试制作一个非常简单的绘图应用程序(Cocoa)。在我的自定义视图中,我有drawRect:方法,它在光标位置创建一个矩形:

- (void)drawRect:(NSRect)rect{
NSPoint point = [self.window mouseLocationOutsideOfEventStream];
NSRectFill(NSMakeRect(point.x, point.y, 5, 5)); }

我还实现了mouseDown:和mouseDragged :,两者都告诉视图重绘区域drawRect:将填充。

     NSPoint point = [self.window mouseLocationOutsideOfEventStream];
[self setNeedsDisplayInRect:NSMakeRect(point.x,point.y,5,5)];

但是,如果我将光标移动到中等速度,则绘制的对象之间会有间隙。此外,如果在旧的矩形上绘制新的矩形,则会显示白色边框。因此我得出结论,我必须使用错误的工具集。当实时移动视图时,如何让鼠标XY出现在鼠标XY上?

1 个答案:

答案 0 :(得分:2)

如果我理解正确你必须指的是当你移动鼠标足够快时,相互之间有一定距离绘制的矩形,即不是每个像素连续绘制。

嗯,我猜这是标准行为,因为鼠标指针实际上沿着屏幕上的移动路径跳过某些位置。换句话说,当快速移动时,鼠标指针不会遍历屏幕上的每个像素。

(编辑:原因很明显:鼠标有一个固定的跟踪频率;因此鼠标突然快速移动,跟踪点更粗糙)

我无所畏惧,你必须自己沿着指针路径创建矩形插值。存储上一个鼠标位置并绘制在旧位置和新位置之间插值的形状。像这样:

enter image description here