OPhone動畫原理及示例

2021-05-23 18:07:19 字數 1902 閱讀 7262

當乙個childview要重畫時,它會呼叫其成員函式invalidate()這個函式將通知其parentview這個childview要重畫,這個過程一直向上遍歷到viewroot,當viewroot收到這個通知後就會呼叫decorview的dispatchdraw()這個函式,dispatchdraw會呼叫其每乙個childview的draw()函式,view的draw()函式就是它具體畫它的內容的地方,它會呼叫ondraw函式,對使用者來說只需要過載view::ondraw()就可以了。view::ondraw()有乙個畫布引數canvas,畫布顧名思義就是畫東西的地方,ophone會為每乙個view設定好畫布,view就可以呼叫canvas的方法,比如:drawtext, drawbitmap, drawpath等等去畫內容。每乙個childview的畫布是由其parentview設定的,parentview根據childview在其內部的布局來調整canvas,其中畫布的屬性之一就是定義和childview相關的座標系,預設是橫軸為x軸,從左至右,值逐漸增大,豎軸為y軸,從上至下,值逐漸增大,見圖2:

0 l0 d* h; ^2 y  c- @/ q+ s

ophone動畫就是通過parentview來調整childview的畫布座標系來實現的,下面以平移動畫來做示例,見圖3,假設在動畫開始時childview在parentview中的初始位置在(100,200)處,這時parentview會根據這個座標來設定childview的畫布,在parentview的dispatchdraw中它發現childview有乙個平移動畫,而且當前的平移位置是(100, 200),於是它通過呼叫畫布的函式traslate(100, 200)來告訴childview在這個位置開始畫,這就是動畫的第一幀。如果parentview發現childview有動畫,就會不斷的呼叫invalidate()這個函式,這樣就會導致自己會不斷的重畫,就會不斷的呼叫dispatchdraw這個函式,這樣就產生了動畫的後續幀,當再次進入dispatchdraw時,parentview根據平移動畫產生出第二幀的平移位置(500, 200),然後繼續執行上述操作,然後產生第三幀,第四幀,直到動畫播完。具體演算法描述如下:

! s5 j: n/ n, ?6 k5 d( }

view plaincopy to clipboardprint?

9 ]# m4 f' k  m$ v/ p

( r, l% w5 i& ^* j. g+ a/ i/ }

- m1 s( j9 m6 c) r8 a2 y* i

dispatchdraw()

6 p" /$ z* e6 j7 g1 o$ m5 z0 _

( z9 e- w  b( k& ]& z4 /

/ z* q8 o8 c* a$ r' c' f; c2 d

5 o- /$ ^# [+ u8 y4 _

4 y$ p  u. a1 n8 c8 d6 r

& u! m% b4 ?6 }% r$ @6 x

* /# n" 3 t2 r2 o- i

view plaincopy to clipboardprint?

* e$ l0 k0 q8 @

8 o2 z0 r7 j+ v% q3 @3 [

' y+ y* k1 [  j2 l

camera類是用來實現繞y軸旋轉後透視投影的,我們只需要其返回的matrix值,這個值會賦給transformation中的矩陣成員,當parentview去為childview設定畫布時,就會用它來設定座標系,這樣childview畫出來的效果就是乙個繞y軸旋轉同時帶有透視投影的效果。利用這個效果便可以作出像

iphone的coverflow這樣比較酷的動畫。

結束語( j, t& ~' o* r

本文介紹了ophone動畫框架的基本原理,可以幫助開發者深入理解ophone的動畫是如何實現的,從而能夠充分利用現有框架來作出夠眩,夠酷的動畫效果。

人臉檢測原理及示例 OpenCV Python

opencv是intel開源計算機視覺庫 computerversion 它由一系列c函式和少量 c 類構成,實現了影象處理和計算機視覺方面的很多通用演算法。opencv 擁有包括 300 多個c函式的跨平台的中 高層 api。它不依賴於其它的外部庫 儘管也可以使用某些外部庫。opencv 對非商業...

RSA演算法原理及應用示例

rsa演算法是一種基於公鑰和私鑰的加密演算法,是由ronald rivest,adi shamir和len adleman三人在diffie helman指數金鑰交換演算法的 基礎上於1977年設計出來的,rivest設計的加密系統利用了數學領域的乙個事實,那就是雖然把兩個大素數相乘生成乙個合數是件...

Lua熱更新原理及示例

網上有不少lua熱更新的文章,都只說了理論,被沒有給出實際可操作的 下面是我寫的幾個例子。lua的require modelname 把乙個lua檔案載入存放到package.loaded modelname 當我們載入乙個模組的時候,會先判斷是否在package.loaded中已存在,若存在則返回...