3

我正在制作一个简单的 iPhone 绘图程序作为个人副项目。

我在子类 UIView 中捕获触摸事件并将实际内容渲染到单独的 CGLayer。每次渲染后,我调用 [self setNeedsLayout] 并在 drawRect: 方法中将 CGLayer 绘制到屏幕上下文。

这一切都很好,并且在绘制矩形时表现得很好。但是,我只想要一个简单的“手绘”模式,就像许多其他 iPhone 应用程序一样。

我想这样做的方法是创建一个 CGMutablePath,并且很简单:

CGMutablePathRef 路径;
-(无效)触摸开始{
    路径 = CGMutablePathCreate();
}
-(无效)触摸移动{
    CGPathMoveToPoint(路径,NULL,x,y);
    CGPathAddLineToPoint(路径,NULL,x,y);

}
-(void)drawRect:(CGContextRef)context {
      CGContextBeginPath(上下文);
      CGContextAddPath(上下文,路径);
      CGContextStrokePath(上下文);
}

但是,在绘制超过 1 秒后,性能会严重下降。

如果不是为了可变不透明度,我只会将每一行绘制到屏幕外的 CGLayer 中!小于 100% 的不透明度会导致屏幕上留下连接线条的点。我看过 CGContextSetBlendingMode() 但可惜我找不到答案。

谁能指出我正确的方向?其他 iPhone 应用程序能够以非常高的效率做到这一点。

4

2 回答 2

1

问题是CGStrokePath()当前可变路径被关闭和绘制,并且当您移动手指时会创建一条新路径。因此,您可能最终会得到很多用于一键式“会话”的路径,至少您的伪代码似乎是这样做的。

您可以尝试在触摸开始时开始一条新的可变路径,CGAddLineToPoint()在触摸移动时使用并在触摸结束时结束路径(就像您的伪代码所示)。但是在 draw 方法中,你绘制了当前可变路径的副本,而实际的可变路径仍在被拉长,直到触摸结束,所以你只能得到一个用于整个触摸会话的路径。触摸结束后,您可以永久添加路径 - 例如,您可以将所有路径放入一个数组并在 draw 方法中迭代它们。

于 2009-11-11T12:42:00.620 回答
1

SanHolo 所说的 - 加上你可能想要限制添加点,所以它只添加一个新点,不超过每 10 毫秒,比如说(你需要玩间隔)。你可以用一个简单的计时器来做到这一点。

另外,您如何指示需要重绘自身的视图?您可能也想限制它 - 它可能比点捕获的间隔更长(例如,捕获点不超过每 10 毫秒,重绘频率不超过每 200 毫秒 - 你需要再次使用数字) .

在这两种情况下,您都需要确保,如果没有任何事情发生超过捕获最后一个点的时间间隔,或者请求重绘。这就是计时器进来的地方。

于 2009-11-11T13:45:44.597 回答