天天看點

動畫分析步驟“三步曲”1 動畫分析方法2 登入按鈕移動動畫效果:閉包形式3 登入按鈕移動動畫效果:方法形式4 UIView視圖中常見動畫的屬性分析5 小結

  首先先來看看動畫設計中的三個角色:産品設計師、算法分析師以及偉大的程式員都有哪些職責。

(1)産品設計師:告訴大家想做一個什麼樣的動畫。

(2)算法分析師:分析動畫的實作原理并設計相應的動畫算法。

(3)程式員:思考如何用代碼實作算法。

  在一般中小規模的公司中,開發人員往往都是身兼數職。不僅要編寫代碼還要參與到算法的設計中去,甚至參與到動畫原型的設計中去。是以弄清楚動畫設計過程中的不同角色,以及搞清楚動畫的分析過程是非常有必要的。

  下圖是我們想要實作的動畫效果,那麼如何來分析它呢?其實産品設計師在設計動畫時,如果能夠将動畫分解為單幀圖像,或者能夠較為慢速地展現動畫的變化過程,那麼對于算法分析師和程式員分析動畫的原理,以及設計合适的展現算法起着非常重要的作用。下圖描述了登入按鈕從左到右逐漸移動的效果,并最後停留在視圖層中間位置這一過程。

動畫分析步驟“三步曲”1 動畫分析方法2 登入按鈕移動動畫效果:閉包形式3 登入按鈕移動動畫效果:方法形式4 UIView視圖中常見動畫的屬性分析5 小結

  這個動畫效果非常簡單,可以用一句話來描述其實作算法,即圖像的水準方向位置坐标和時間呈線性漸變關系。接下來思考如何用代碼實作這個效果。按照動畫的展示過程,這裡将動畫分為:動畫起始階段、動畫進行階段和動畫結束階段。

  在動畫啟動的瞬間,希望動畫從螢幕可視界面外飛入進來。如下圖所示的登入按鈕是需要實作的動畫起始位置。

動畫分析步驟“三步曲”1 動畫分析方法2 登入按鈕移動動畫效果:閉包形式3 登入按鈕移動動畫效果:方法形式4 UIView視圖中常見動畫的屬性分析5 小結

  在ios視圖中,左上角為視圖的原點(0,0),水準向右為x軸遞增方向,豎直向下為y軸遞增方向,隻有當view視圖位于手機螢幕展示坐标系之内,大家才能看到(虛線區域内控件不可見),否則登入按鈕是不可見的。是以在動畫的起始階段可以将動畫的位置屬性設定在界面之外。

  經過前面的分析,大家已經了解了這個動畫效果的實作算法,即登入按鈕的坐标沿水準方向随時間線性變化。如表1.1所示描述了不同時間段登入按鈕的坐标變化情況。幸運的是大家不需要手動設計這一過程,甚至不需要手動寫線性漸變的方法,因為ios在uiview的顯示層已經幫我們把這個功能內建了。ios在uiview圖層中不僅內建了動畫的線性漸變方法,而且動畫的加速、減速以及複雜的動畫變化時間函數、運動路徑函數也已經為大家內建好了,是以隻需要學會如何使用這些豐富的api即可,且這個功能隻需要幾行代碼就可以實作。

  表1.1 6s下qq圖示移動效果:qq圖示x、y坐标随時間變化關系表

動畫分析步驟“三步曲”1 動畫分析方法2 登入按鈕移動動畫效果:閉包形式3 登入按鈕移動動畫效果:方法形式4 UIView視圖中常見動畫的屬性分析5 小結

  在動畫效果結束之後沒有觸發新的回調事件,隻是更新了目前登入按鈕的最後位置,是以圖檔最終停留在視圖層的中間位置。

首先建立一個單視圖工程,建立好之後可以看到下圖的工程檔案目錄結構:

動畫分析步驟“三步曲”1 動畫分析方法2 登入按鈕移動動畫效果:閉包形式3 登入按鈕移動動畫效果:方法形式4 UIView視圖中常見動畫的屬性分析5 小結

  動畫實作的第一階段:動畫起始階段

  在開始正式添加動畫代碼之前需要為應用添加一個背景圖檔。在main.storyboard中為整個工程添加一個已經準備好的背景圖檔,背景圖檔依托在uiimageview上。

動畫分析步驟“三步曲”1 動畫分析方法2 登入按鈕移動動畫效果:閉包形式3 登入按鈕移動動畫效果:方法形式4 UIView視圖中常見動畫的屬性分析5 小結

  上圖為目前工程的main.storyboard中圖層結構,其中view controller為整個工程的視圖控制器,login為uiimageview登入背景圖檔。下圖示是準備好的背景圖檔,通過下圖可以看出,要想實作最初所示的動畫效果,隻需為整個登入界面添加一個登入按鈕即可。

動畫分析步驟“三步曲”1 動畫分析方法2 登入按鈕移動動畫效果:閉包形式3 登入按鈕移動動畫效果:方法形式4 UIView視圖中常見動畫的屬性分析5 小結

  動畫起始階段代碼需要放在什麼位置才合适呢?要想弄清楚這個問題先搞清楚viewcontroller.swift 中幾個方法的執行順序。需要關注以下3個方法。

  在應用啟動之後,在viewdidload中會裝載所有的view視圖,注意,雖然所有view視圖都被裝載進來,但是這時所有的view視圖并不是可見的。程式接着調用viewwillappear方法,這是視圖在展現之前需要調用的方法。而最後調用viewdidappear,表明所有的視圖已經可見。經過以上分析,大家應該清楚,在動畫起始階段可以将所有的初始化代碼放置在viewdidload()方法中。具體實作代碼如下所示。

  代碼第1行建立了一個uibutton登入按鈕。第3行重寫viewdidload方法,表明應用啟動之後首先通過調用viewdidload方法加載各種ui組鍵。第4行設定目前uibutton登入按鈕的位置,按鈕的x坐标設定在整個界面之外,是以目前button按鈕是不可見的。第5行為登入按鈕添加一個淡綠色背景。第6行設定登入按鈕title内容。最後一行将按鈕添加到self.view圖層上。

  動畫實作的第二階段和第三階段:動畫進行階段和動畫結束階段

要想實作應用打開動畫即展現的效果,需要在view視圖整體展現之前完成動畫實作的第二階段和第三階段的設定(因為如果視圖已經顯示了才設定動畫效果,那麼會有動畫不連貫的現象),是以這部分功能隻能放置在viewwillappear方法中。

這裡使用的uibutton按鈕和ui控件都是繼承uiview類,uiview類中有一個動畫方法可以完成我們想要實作的功能:

  該方法屬于類方法,類名可以直接調用,表明為目前的uiview添加一個動畫效果,它的每個參數的含義如下。

duration:表明動畫執行周期。

animations:表明動畫執行内容。

注意,這裡animations是一個閉包,使用閉包的方式将動畫代碼追加進去。在閉包中隻需要将動畫的結束狀态設定完成,那麼動畫從開始到結束的中間過程,ios都會自動實作。下面為viewwillappear()中的動畫實作代碼。

  animate方法中,duration表明動畫執行周期為1s,動畫閉包部分表明登入按鈕最終的位置,即最終停留在手機螢幕的中間位置。

  除了使用閉包的方法之外,還可以使用另外一種方式實作這個動畫效果,即通過commit相關方法的形式來實作。通過修改viewwillappear()中的内容,可以實作相同的動畫效果。下面是動畫移動效果的另外一種代碼實作方式。

  代碼第1行表明動畫開始,這裡先忽略需要傳遞的參數,可以先傳遞兩個nil。第2行設定動畫執行周期,這裡将動畫周期設定為1s。第3行将登入按鈕設定在螢幕中間位置。代碼最後一行将動畫效果送出到系統上運作。

  其實無論是第2節的動畫實作方法抑或是第3節的動畫實作方法,都可以把動畫實作的過程總結為下面的3個步驟。

動畫分析步驟“三步曲”1 動畫分析方法2 登入按鈕移動動畫效果:閉包形式3 登入按鈕移動動畫效果:方法形式4 UIView視圖中常見動畫的屬性分析5 小結

  而第2節和第3節實作動畫的唯一差別就是一個使用閉包的形式,而另一個使用beginanimations和commitanimations方法的形式啟動動畫。

  我們在第2節和第3節主要依靠uiview下的frame屬性來實作登入按鈕從左到右的進入效果。那麼uiview下的其他屬性是不是也可以有類似的效果呢?要想回答這個問題,首先需要弄清楚uiview都有哪些常見的屬性。

  frame、bounds、center都是描述uiview的位置資訊,不同的是frame可以對x坐标、y坐标、width、height四個屬性進行操作,frame的x坐标和y坐标相對于父控件的原點來計算,而bounds一般隻能對width、height進行操作,它的x、y坐标隻相對于自身而言,center描述的是x、y資訊,即uiview的中心位置。下面是cgrect、origin、size的代碼描述。

  再來看看三者的資料類型。frame是cgrect類型,它是一個結構體,在結構體中包含origin和size兩個屬性。其中origin描述uiview的x、y坐标起始位置資訊,size描述uiview的width、height寬高資訊。我們再來看看origin的cgpoint和size的cgsize又是什麼。

  cgpoint中包含了uiview的x、y坐标,而cgsize中包含了uiview的width、height資訊。通過對frame中資料類型的追本溯源,可以得到以下結論:cgrect分别對應x坐标、y坐标、width、height四個屬性。這四個屬性表明目前ui在它的父控件上的位置,如self.view上。

  通過以上分析可以知道,可以通過x、y坐标修改uiview的移動位置,還可以通過修改width或者height來修改uiview的拉伸、收縮效果。對于bounds屬性使用最多的還是width、height屬性,center則經常使用x、y坐标屬性。

  uiview的alpha透明度屬性也可以用作動畫效果。當alpha為0時,表明uiview已經隐藏,當alpha為1時uiview顯示。結合這一特征可以通過修改alpha在動畫開始、結束時的值,實作uiview的淡入淡出效果。

  uiview是視圖顯示的容器,負責内容顯示和事件響應。每個uiview都有一個layer圖層,在這個圖層中承載的是視圖的内容,是以結合layer可以實作很多進階的動畫效果。當然除了這些之外,uiview還有很多其他屬性,在後面的章節中會為大家一一呈現。

  通過對本文的學習,相信大家基本上掌握了動畫分析的基本步驟,在這裡總結一下動畫實作的三個步驟:

(1)設定視圖的動畫初始狀态。

(2)添加視圖的動畫相應屬性。

(3)設定視圖的動畫最終狀态。

  在通過幀分解等方法了解了動畫的實作原理之後,通過這三個步驟可以很友善地實作各種動畫效果。本章結合登入按鈕移動效果為大家展示了動畫分析和實作的全過程,并通過代碼詳細介紹了通過閉包方式,以及beginanimations和commitanimations方法的形式實作動畫。

  對于uiview中常見的動畫屬性,結合uiview對視圖的位置、透明度、幾何形狀給大家做了簡要的分析,在後面的章節中會結合具體的代碼,為大家呈現缤紛多彩的動畫效果。

  [本文選自《ios動畫——核心技術與案例實戰》,點此連結可在博文視點官網檢視。]

                      

動畫分析步驟“三步曲”1 動畫分析方法2 登入按鈕移動動畫效果:閉包形式3 登入按鈕移動動畫效果:方法形式4 UIView視圖中常見動畫的屬性分析5 小結

  想及時獲得更多精彩文章,可在微信中搜尋“博文視點”或者掃描下方二維碼并關注。

                       

動畫分析步驟“三步曲”1 動畫分析方法2 登入按鈕移動動畫效果:閉包形式3 登入按鈕移動動畫效果:方法形式4 UIView視圖中常見動畫的屬性分析5 小結

繼續閱讀