【问题标题】:Simple iPhone drawing app with Quartz 2D带有 Quartz 2D 的简单 iPhone 绘图应用程序
【发布时间】:2009-08-09 10:06:47
【问题描述】:

我正在制作一个简单的 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 应用程序能够以非常高的效率做到这一点。

【问题讨论】:

    标签: iphone drawing quartz-graphics cgcontext


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-09-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多