如何使用性能为多边形蒙版设置动画?

时间:2010-01-08 16:12:16

标签: iphone uiview

我遇到了性能问题。

我创建了一个UIView并覆盖了它的drawRect函数。在这个函数中,我正在绘制一个图像(大图像),然后在整个屏幕上有一个白色正方形,里面有一个多边形,带有CGContextEOFillPath。结果是显示图像部分(由多边形定义)的白色屏幕。

之后,我创建了一个函数来动画那个多边形到另一个多边形的过渡。除了多边形动画之外,还应缩放图像并移动以固定屏幕上的图像。我用NSTimer做到了。多边形的动画包括计算每个顶点之间的距离,然后根据elapsedTime移动到一个位置。它在模拟器上工作得很好,但真的被设备搞定了。

阅读有关性能的信息,在stackoverflow,我找到了使用beginAnimations和commitAnimations的替代方法。我正在改变所有方法以使用该方法与图像。但是我可以用多边形做什么呢。使用CGContextMoveToPoint和CGContextAddLineToPoint绘制多边形,因此我认为它无法使用beginAnimations进行动画处理。我是对的?有没有更好的方法呢?

期望的结果就像这个漫画阅读器应用程序:http://www.comixology.com/iphoneapp(点击导游。在视频中间他们显示“自动屏蔽”功能)

2 个答案:

答案 0 :(得分:0)

使用Core Animation,您可以为“动画”(原文如此)属性设置动画。 Apple的文档列举了Mac OS X中的可动画属性:

http://url.akosma.com/55

在iPhone的情况下,当给定属性是嗡嗡声,可动画时,UIView文档明确地说“动画”。其中最强大的是(IMHO)UIView的“transform”属性,它将CGAffineTransform结构作为输入,或者采用CALayer的“transform”属性(采用CATransform3D结构)。两者都是可动画的,并为您提供创造任何所需转换的巨大力量。

现在,在您的情况下,实际上,您无法以“简单”的方式为多边形设置动画。我敢打赌,您可以尝试映射符合您需求的CGAffineTransforms(缩放,平移),并将其应用于使用Quartz代码创建的非动画固定视图。

我希望我足够清楚:)

答案 1 :(得分:0)

我的建议是在主图像视图上使用CAShapeLayer覆盖,CAShapeLayer是您想要遮罩的视图的大小,并且在其中心有一个孔的多边形路径。只要两条路径具有相同数量的控制点,CAShapeLayers就可以让您从一个CGPathRef动画到另一个CGPathRef。你需要在这里使用CABasicAnimation进行动画制作,而不是UIView begin / commitAnimations块,但这并不太难。

Joe Ricioppo在帖子here中有一个很好的动画CAShapeLayer路径示例。