绘画,动画,线程

原创
2014/11/06 21:25
阅读数 68

当你改变一个可见view的属性时,即使没有使用动画,属性的变化也不会即时发生。实际上,系统会记录下你想要的改变,并标记这个view需要重绘。你可以改变许多view的可见属性,但是这些改变都是积累起来形成指令。之后,当你的代码都运行完之后,系统会有一个空闲时间,此时她就会重绘所有需要重绘的views,这个时刻就叫“重绘时刻”,稍后会有详解。 你可以对上面的理论进行验证,例如通过简单的将一个view的可见属性进行改变,接着再将其改回原来的值,运行之后你会发现,什么动画效果都没有。例如,假设一个view的背景色是绿色,通过代码将其变为红色,然后又改为绿色:

// 开始绿色改为红色
view.backgroundColor = [UIColor redColor];
// ... 耗时操作...
view.backgroundColor = [UIColor greenColor];
// 代码运行结束,这里就是重绘时刻了

系统会累积所有期望的改变直至重绘时刻到来,重绘时刻只有在代码运行结束的时候才会到来,所以当重绘时刻来临的时候,最后一个累积的变化是将view的背景色设置为绿色,刚好是原来的颜色。因此,无论在有多少耗时代码在两个颜色改变之间,用户是不会看大颜色的改变的。 所以你不应该命令一个view去重绘,而是告诉她需要重绘通过调用setNeedsDisplay这个方法。 类似的,当你请求执行一个动画时,动画直到重绘时刻才会发生。(可以强制立即进行动画,但不常用。) 现在我们来谈谈动画执行的机制。其实动画都是精致的幻觉而已。把动画想成一部电影,卡通片,被插入到了用户和真实的屏幕之间,当动画执行时,电影就被叠加在了屏幕上。动画结束时,电影也被移走了,显示出电影后面真正的屏幕。用户完全没有意识到这些,因为当电影开始时,电影的第一帧和真实的屏幕一模一样,当电影结束的时候,电影的最后一帧也和真实的屏幕一样。 所以,当你通过动画将一个view从位置1放置到位置2时,可以预想一个典型的事件序列: 1.view被设置到位置2,但是重绘时刻没有到来,所以仍然会停留在位置1 。 2.剩余的代码运行完毕。 3.重绘时刻到来,如果没有动画,view将会突然从位置1跳刀位置2。如果指定了动画,就会从位置1开始,用户看到的位置仍然是位1,就像电影的第一帧一样。 4.动画开始,view会显示在位置1和位置2之间。 5.动画结束,view已经到达位置2 。 6.动画被移除,view的的确确放在了位置2 。 意识到“电影”和真实发生在view上的动画的不同之处是正确配置动画的关键之处。新手经常抱怨定位一个view运行时正常的,但是动画结束之后,view跳到了别的位置。这种情况一般是你设置好了动画但是没能成功将其移至动画最终的位置。跳动发生的原因是因为当动画结束后,真实的位置不匹配动画的最后一帧。 动画是在单独的线程中发生的。你不需要担心细节问题(减去了多线程的复杂处理啊!)。 当动画结束时,一般需要通知相应的代码这是一个经常遇到的需求。大多数动画APIs提供了设置通知的方式。如动画结束通知可以用来链接动画:一个动画结束紧接着下一个动画执行,还有就是进行一些清理工作。常遇到的就是处理触摸事件。一个经验就是在执行动画的时候关闭响应,为了不产生各种奇怪的情况。

展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部