欢迎来到天天文库
浏览记录
ID:12467564
大小:35.02 KB
页数:13页
时间:2018-07-17
《解析ios动画原理与实现》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、解析iOS动画原理与实现这篇文章不会教大家如何实现一个具体的动画效果,我会从动画的本质出发,来说说iOS动画的原理与实现方式。什么是动画动画,顾名思义,就是能“动”的画。人的眼睛对图像有短暂的记忆效应,所以当眼睛看到多张图片连续快速的切换时,就会被认为是一段连续播放的动画了。比如,中国古代的“走马灯”,就是用的这个原理。有些人还会在一个本子每页上手绘一些漫画,当快速翻页的时候,也会看到动画的效果,比如:计算机动画的实现方式动画是由一张张图片组成的,在计算机中,我们称每一张图片为一帧画面。如果我们想实现这么一个动画:一个水杯放在桌子的左边,移动到右边,那么我们实际操作的,只是水杯。所
2、以动画的实现,只是对运动变化了的部分的处理。逐帧与关键帧类似于上面提到的手绘翻页方式,我们可以将这个水杯在每帧画面中的位置一一找出来,这样实现动画的方式就叫作逐帧动画,我们需要处理动画中的每一帧。我们一般在计算机上用FPS(FramesPerSecond),即每秒的帧数来表示动画的刷新速度,基于屏幕的刷新率等其他原因,在计算机上一般采用60FPS。如果运动变化幅度较缓,减半到30FPS时,我们肉眼也是可接受的。较低的FPS会让我们有“卡顿”的感觉。逐帧动画是最直接的,但要处理的帧数太多,所以实现过程是会麻烦。计算机的工作就是来完成重复单调的工作的,所以,有些工作是可以考虑让计算机来
3、完成的。上面的例子,可以变成一个涉及数学和物理的问题:一个杯子初始位置在左边,n秒后匀速运动到右边,那么在每1/60秒的时候,这个杯子的位置显然是可以计算出来的了。所以,我们其实只需要指定一些关键信息就能让计算机自己计算出每一帧杯子的位置了:·起始位置,比如一个坐标(0,0)·结束位置,再比如一个坐标(100,0)·动画总时间,比如0.25秒·匀速运动这种方式就称之为关键帧动画。即我们只需要给定几个关键帧的画面信息,关键帧与关键帧之间的过渡帧都将由计算机自动生成。这里说的关键帧动画,是指的广义上的一种动画制作方式,并不仅指CAKeyframeAnimation,CABasicAni
4、mation的实现方式也属于关键帧动画iOS动画说完广义上的动画,就可以来说说iOS的动画了。先来说说动画的本质。动画的本质继续用上面的简单例子:一个UIView从(0,0)匀速移动到(100,0)的动画,动画总时间是0.25秒。假设我们基于60FPS来显示动画,那么在0.25秒内就应该有15帧画面,在每帧画面中,这个UIView的x坐标,每次应移动100/15的距离。如果我们每隔0.25/15秒刷新一次UIView的x坐标,那么就能实现这个动画效果了。对于x坐标而言,每帧的位置就可以通过一个基于时间变化量的函数来求得:x=f(t)。所以,一个动画的本质,就是动画对象(这里是UIV
5、iew)的状态,基于时间变化的反应了。简单说,就是给定任意一个时刻,如果你都能得到这个动画对象的位置和、形状等等属性,你就能实现这个动画了。属性值的变化,既可能是位置、透明度、旋转角度等的变化,也包括形状的改变,比如从一条直线变化成一个圆圈,目标就是要得到变化过程中特定时刻的中间态。动画的实现我们也可将iOS的动画分为两大类:·系统提供的关键帧动画实现方式;用户指定关键信息,系统实现动画过程,对用户而言操作起来会简单些。·逐帧动画实现方式;用户自己画出每一帧画面,系统操作方法简单,但用户操作的工作量就会大一些。逐帧动画实现方式简单的说,要实现逐帧的方式,就是需要周期性的调用绘制方法
6、,绘制每帧的动画对象。这里说的绘制,不光是指覆写UIView的-drawRect:的方法来手动重绘视图,也包括修改UIView它的属性,比如位置、颜色等。iOS的动画都是基于CALayer的,iOS的UIView背后都有一个对应的CALayer。对UIView的修改实际上都是对背后CALayer的修改。但如果在逐帧绘制的方法中修改了一个自建的CALayer,这个CALayer不是对应某个UIView的,需注意系统的隐式动画的影响,后面会提到这点。而周期性,就需要一个定时器来完成了,即CADisplayLink。CADisplayLink与NSTimer比较类似,可以周期性的调用指定
7、的方法。之所以用CADisplayLink,是因为它是基于屏幕刷新率的,即屏幕每次刷新时就会触发调用。iPhone的屏幕刷新率是60FPS。如果绘制过程过于复杂,不能在屏幕刷新一帧的时间内完成,可以考虑改为每隔一帧绘制,相当于是30FPS的刷新率。不然可能会使动画不连贯,有卡顿感。用逐帧方法绘制的原理不是很麻烦,麻烦的是绘制过程。对于一个复杂动画,你可能需要运用各种物理、几何知识去计算视图中间状态的信息。比如要实现一条直线卷曲变化为一个圆的动画,你就需要计算出中间态的
此文档下载收益归作者所有