【问题标题】:setNeedsDisplay not fast enough (what's the right way to do this?)setNeedsDisplay 不够快(这样做的正确方法是什么?)
【发布时间】:2014-02-03 07:29:02
【问题描述】:

我正在尝试制作一个非常简单的绘画应用程序(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 上?

【问题讨论】:

    标签: macos cocoa drawing


    【解决方案1】:

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

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

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

    恐怕没有什么可做的,您必须自己沿着指针路径创建矩形插值。存储以前的鼠标位置并绘制一个在旧位置和新位置之间插值的形状。像这样:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多