動(dòng)畫效果并不受限于某一個(gè)框架,iOS動(dòng)畫絕對(duì)不等于coreAnimation,提供一些動(dòng)畫api也只是coreAnimation冰山一角.
雖然不受限于框架,但是畢竟還得用API來實(shí)現(xiàn)動(dòng)畫,只考慮常規(guī)UI動(dòng)畫的話,基本上是UIKit,CoreAnimation,CoreGraphics這三個(gè)了.
另外ImageIO可能也算,畢竟gif也是動(dòng)畫,需要用ImageIO來解析gif.
上面都是中上層框架,此外還有更底層的用OpenGL/Metal來繪制動(dòng)畫.
涉及的領(lǐng)域包括圖形學(xué)基礎(chǔ),iOS線程與UI的關(guān)系,coreAnimation渲染流程,GPU與CPU如何分工,以及顯示器的工作原理等等.
從動(dòng)畫的表現(xiàn)來說:
1.它可以是內(nèi)容的變化,比如圖片切換,包括其變換形式,比如漸變,翻頁,翻滾等等;
2.也可以是2d或3d的仿射變換,平移,縮放,旋轉(zhuǎn);
3.可以是顏色與透明度的變化.
4.可以是圖形繪制的變化,從一個(gè)點(diǎn),到一條線,到一個(gè)圖形.
從實(shí)現(xiàn)動(dòng)畫的角度來說,可以是:
1.使用框架的API實(shí)現(xiàn),比如把定時(shí)器+透明度換成CABasicAnimation.框架不僅僅提供了如何實(shí)現(xiàn)動(dòng)畫,還提供了一些預(yù)設(shè)算法,比如timing函數(shù),比如貝塞爾曲線,以及物理引擎等.
2.通過修改載體的屬性來實(shí)現(xiàn),前面說到動(dòng)畫的表現(xiàn),實(shí)現(xiàn)這些表現(xiàn)就可以了,例如整一個(gè)定時(shí)器,定期改變載體的屬性,比如坐標(biāo),比如透明度.這方面主要是在框架不能滿足需求的時(shí)候使用(其實(shí)更多的時(shí)候是我們不知道框架能做這種事,或者說不了解框架).
通過CoreGraphics來實(shí)現(xiàn)動(dòng)畫,主要用來實(shí)現(xiàn)圖形繪制,本身和動(dòng)畫沒啥關(guān)系,實(shí)質(zhì)就是實(shí)時(shí)的高頻率的繪制形成動(dòng)畫效果.
本身并沒有提供與動(dòng)畫相關(guān)的API,只能通過第一條來實(shí)現(xiàn)動(dòng)畫.
主要是為了解決只能用CoreGraphics來繪制的圖形,它所產(chǎn)生的動(dòng)畫.
比如扇形或者環(huán)形的圖表,或者一些線條與色塊變換的這種圖標(biāo)動(dòng)畫.
CoreAnimation的脈絡(luò):圖層樹 -> 視覺效果 -> 寄宿圖 -> 仿射變換 -> 專用圖層 -> 隱式與顯式 -> 速度函數(shù) -> 圖層時(shí)間 -> 圖像IO -> 性能調(diào)優(yōu).
CALayer及其各種子類,可以使用第一條來實(shí)現(xiàn)動(dòng)畫.
CAScrollLayer類似UIScrollView的效果;
CATiledLayer圖層縮放,使用異步實(shí)現(xiàn)加載查看大圖;
CATransformLayer實(shí)現(xiàn)真正的3D圖層,而不是仿射變換;
CAReplicatorLayer可以制作圖層的副本,這些副本可以應(yīng)用不同的仿射變換和顏色;
另外還有一些用于Metal和OpenGL的CALayer子類.
并且CAAnimation及其子類提供了專門的動(dòng)畫API,對(duì)應(yīng)實(shí)現(xiàn)動(dòng)畫的第二條.
CAPropertyAnimation屬性動(dòng)畫,可作用于CALayer的帶有Animatable描述的屬性.但它是抽象類,不直接使用.
CABasicAnimation繼承自CAPropertyAnimation,使用它實(shí)現(xiàn)屬性動(dòng)畫.
CAKeyframeAnimation利用timingFunction實(shí)現(xiàn)自定義的幀動(dòng)畫.
CASpringAnimation在屬性動(dòng)畫的基礎(chǔ)上實(shí)現(xiàn)彈性效果.
使用CAEmitterLayer和CAEmitterCell實(shí)現(xiàn)粒子效果,前者是顯示層,后者是控制器.
以及與速度相關(guān)的CAMediaTimingFunction,用于定義時(shí)間函數(shù),有預(yù)定的值比如淡入淡出等等.或者使用貝塞爾曲線實(shí)現(xiàn).
CADisplayLink或者NSTimer控制繪圖與屏幕刷新同步,協(xié)議CAMediaTiming對(duì)"時(shí)間"的定義.
CATransition轉(zhuǎn)場動(dòng)畫,
包括movein,reveal,push,fade,pageCurl,pageUnCurl,cube,oglFlip,stuckEffect,rippleEffect,cameraIrisHollowOpen,cameraIrisHollowClose等.
CATransaction隱式事務(wù).
UIKit是個(gè)大雜燴,實(shí)現(xiàn)動(dòng)畫的API也是花樣繁多,并且提供了一套實(shí)現(xiàn)動(dòng)畫+控制動(dòng)畫進(jìn)程+獲取動(dòng)畫狀態(tài)的API.
甚至還準(zhǔn)備了物理引擎UIDynamicAnimator.定義了一些物理行為如碰撞,重力,彈性,加速度等.甚至還可以描述物理中場的概念.
不僅是對(duì)CoreAnimation的封裝,還增加了很多擴(kuò)展.
UIViewPropertyAnimator來實(shí)現(xiàn)屬性動(dòng)畫,
UIViewAnimating協(xié)議控制動(dòng)畫的狀態(tài),包括活躍(開始與暫停)和非活躍(取消與完成),
UIMotionEffectGroup實(shí)現(xiàn)動(dòng)畫組,
UIViewImplicitlyAnimating在動(dòng)畫的進(jìn)程中修改,
UITimingCurveProvider設(shè)置時(shí)間函數(shù).
此外最熟悉的還得是UIView中提供的一些方法, animateWithDuration系列, transitionWithView系列和animateKeyframesWithDuration等.
還有視圖控制器轉(zhuǎn)場動(dòng)畫相關(guān)的View controller transitions,通過一系列代理來自定義轉(zhuǎn)場動(dòng)畫以及獲取動(dòng)畫狀態(tài).