CoreAnimation編程指南(一)概念

轉載自:http://www.dreamingwish.com/dream-2012/the-concept-of-coreanimation-programming-guide.html


第一章      核心動畫概念

核心動畫是一套包含圖形繪製,投影,動畫的Objective–C類集合。它通過開發人員所熟悉的應用程序套件和Cocoa Touch視圖架構的抽象分層模式,同時使用先進的合作效果提供了一套流暢的動畫。

動態的動畫接口很難創建,但是核心動畫通過提供如下接口使這些創建起來變得更加簡單:

  • 簡單易用的高性能混合編程模型。
  • 類似視圖一樣,你可以通過使用圖層來創建複雜的接口。
  • 輕量級的數據結構,它可以同時顯示並讓上百個圖層產生動畫效果。
  • 一套簡單的動畫接口,可以讓你的動畫運行在獨立的線程裏面,並可以獨立於主線程之外。
  • 一旦動畫配置完成並啓動,核心動畫完全控制並獨立完成相應的動畫幀。
  • 提高應用性能。應用程序只當發生改變的時候才重繪內容。再小的應用程序也需要改變和提供佈局服務層。核心動畫還消除了在動畫的幀速率上運行的應用程序代碼。
  • 靈活的佈局管理模型。包括允許圖層相對同級圖層的關係來設置相應屬性的位置和大小。

使用核心動畫,開發人員可以爲他們的應用創建動態用戶界面,而無需使用低級別的圖形API,如OpenGL來獲取高效的動畫性能。

 

1.1 核心動畫類

核心動畫類有以下分類:

  • 提供顯示內容的圖層類。
  • 動畫和計時類。
  • 佈局和約束類。
  • 事務類,在原子更新的時候組合圖層類。

核心動畫的基礎類包含在Quartz核心框架(Quartz Core framework)裏面,雖然它的其他圖層類在其他框架裏面定義。下圖顯示了核心動畫的類層次結構。

圖 1  Core Animation 類結構

 

 

1.1.1 圖層類(Layer Classes)

圖層類是核心動畫的核心基礎,它提供了一套抽象的概念(假如你使用過NSView或者UIView的話,你一定會對它很熟悉)。CALayer是整個圖層類的基礎,它是所有核心動畫圖層類的父類。

和視圖類(NSView或UIView)一樣,CALayer有自己的父圖層類,同時也擁有自己子圖層類的集合,它們構成了一個圖層樹的層次結構。圖層繪製類似視圖一樣自底向上,並指定其幾何形狀相對他們superlayer,創建一個相對的局部座標系。然而圖層類通過合併變換矩陣允許你旋轉、偏移、拉伸對應的圖層內容。具體內容將會在後面“圖層(Layer)的幾何和變換”部分介紹。

CALayer從Application Kit 和Cocoa Touch的視圖類分離出來,因爲沒有必要爲了顯示內容而繼承CALayer類。因爲CALayer類的內容顯示可以通過以下方法提供:

  • 可以直接或者委託的方式把圖層的內容屬性設置爲Core Graphics image。
  • 提供直接繪製到一個Core Graphics image上下文委託。
  • 設置所有圖層所具有的可視化樣式屬性,比如背景顏色、不透明屬性、蒙版等。

Mac OS X應用同樣可以通過核心圖像濾鏡來訪問它的可視化樣式屬性。

繼承CALayer並通過封裝方法實現以上任何技術。

“提供圖層內容”描述了提供內容層可用方法。可視化樣式樣式屬性和它們的順序將會在 “圖層樣式屬性”部分詳細介紹。

除了CALayer類,核心動畫類同時提供了顯示其他內容的類。這些類在Mac OS X 和 iOS上有細微的差別,以下類在Mac OS X和iOS上都可用:

  • CAScrollLayer 是CALayer的子類,簡化顯示圖層的一部分內容。CAScrollLayer對象的滾動區域的範圍在它的子圖層裏面定義。CAScrollLaye不提供鍵盤或鼠標事件處理,也不提供可見的滾動條。
  • CATextLayer 可以方便的從字符串或字符串的內容創建一個圖層類的內容。
  • CATiledLayer 允許遞增的顯示大而複雜的圖片。

Mac OS X 提供如下額外的類:

  • CAOpenGLLayer 提供了一個OpenGL渲染環境。你必須繼承這個類來使用OpenGL提供的內容。內容可以是靜態的,或可隨着時間的推移更新。
  • QCCompositionLayer (由Quartz框架提供)可以把Quartz合成的內容動畫顯示。
  • QTMovieLayer and QTCaptureLayer (QTKit框架提供)提供播放QuickTime影片和視頻直播。

iOS 提供如下額外的類:

  • CAEAGLLayer 提供了一個OpenGLES渲染環境。

CALayer的類引入鍵-值編碼兼容的容器類概念,也就是說一個類可以使用鍵 – 值編碼的方法存儲任意值,而無需創建一個子類。CALayer的還擴展了NSKeyValueCoding的非正式協議,加入默認鍵值和額外的結構類型的自動對象包裝(CGPoint,CGSize,CGRect,CGAffineTransform和CATransform3D)的支持,並提供許多這些結構的關鍵路徑領域的訪問。

CALayer同時管理與層關聯的動畫和行爲,。圖層接受層樹的插入和刪除層動作,修改層的屬性,或者明確的開發請求。這些行爲通常會導致動畫發生。見“動畫”和“圖層操作”的更多信息。

 

1.1.2    動畫和計時類

圖層的很多可視化屬性是可以隱式動畫的。通過簡單的改變圖層的可動畫顯示的屬性,可以讓圖層現有屬性從當前值動畫漸變到新的屬性值。例如設置圖層的hidden屬性爲YES將會觸發動畫使層逐漸淡出。大多數動畫屬性擁有自己關聯的默認動畫,你可以輕鬆地定製和替換。我們將會在後面“動畫屬性”部分列出一個完整的動畫屬性列表和它們相應的默認動畫。動畫的屬性也可以顯式動畫。要顯式動畫的屬性,你需要創建核心動畫動畫類的一個實例,並指定所需的視覺效果。顯式動畫不會改變該屬性的值,它只是用於動畫顯示。

核心動畫的動畫類使用基本的動畫和關鍵幀動畫把圖層的內容和選取的屬性動畫的顯示出來。所有核心動畫的動畫類都是從CAAnimation類繼承而來。CAAnimation實現了CAMediaTiming協議,提供了動畫的持續時間,速度,和重複計數。CAAnimation也實現了CAAction協議。該協議爲圖層觸發一個動畫動作提供了提供標準化響應。

動畫類同時定義了一個使用貝塞爾曲線來描述動畫改變的時間函數。例如,一個勻速時間函數(linear timing function)在動畫的整個生命週期裏面一直保持速度不變,而漸緩時間函數(ease-out timing function)則在動畫接近其生命週期的時候減慢速度。

 

核心動畫額外提供了一系列抽象的和細化的動畫類,比如:

CATransition 提供了一個圖層變化的過渡效果,它能影響圖層的整個內容。動畫進行的時候淡入淡出(fade)、推(push)、顯露(reveal)圖層的內容。這些過渡效果可以擴展到你自己定製的Core Image濾鏡。

  • CAAnimationGroup 允許一系列動畫效果組合在一起,並行顯示動畫。
  • CAPropertyAnimation 是一個抽象的子類,它支持動畫的顯示圖層的關鍵路徑中指定的屬性
  • CABasicAnimation 簡單的爲圖層的屬性提供修改。
  • CAKeyframeAnimation支持關鍵幀動畫,你可以指定的圖層屬性的關鍵路徑動畫,包括動畫的每個階段的價值,以及關鍵幀時間和計時功能的一系列值。在動畫運行是,每個值被特定的插入值替代。

 

核心動畫 和 Cocoa Animation 同時使用這些動畫類。使用動畫描述,是因爲這些類涉及到核心動畫,這些將會在Animation Types and Timing Programming Guide 有較深入的討論。

 

1.1.3    佈局管理器類

Application Kit的視圖類相對於superlayer提供了經典的“struts and springs”定位模型。圖層類兼容這個模型,同時 Mac OS X上面的核心動畫提供了一套更加靈活的佈局管理機制,它允許開發者自己修改佈局管理器。核心動畫的 CAConstraint 類是一個佈局管理器,它可以指定子圖層類限制於你指定的約束集合。每個約束(CAConstraint類的實例封裝)描述層的幾何屬性(左,右,頂部或底部的邊緣或水平或垂直中心)的關係,關係到其同級之一的幾何屬性層或superlayer。

通用的佈局管理器和約束性佈局管理器將會在“佈局核心動畫的圖層”部分討論。

 

1.1.4    事務管理類

圖層的動畫屬性的每一個修改必然是事務的一個部分。CATransaction是核心動畫裏面負責協調多個動畫原子更新顯示操作。事務支持嵌套使用。

核心動畫支持兩種事務:隱式事務顯式事務。在圖層的動畫屬性被一個線程修改,同時該線程下次迭代的時候自動提交該修改的時候隱式事務自動創建。顯式事務發生在程序在修改動畫屬性之前給CATransaction發送了一個開始消息,在動畫屬性修改之後提交該消息。

事務管理將會在後面的“事務”部分詳細介紹。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章