溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

動畫分析步驟“三步曲”

發(fā)布時間:2020-06-24 16:42:17 來源:網(wǎng)絡 閱讀:381 作者:博文視點 欄目:移動開發(fā)

摘要: 本文將實現(xiàn)簡單的“登錄界面按鈕移動效果”,并通過此動畫效果介紹動畫設計和分析的思路。本文不僅旨在讓大家弄清動畫效果是如何通過代碼來實現(xiàn)的,更重要的是希望大家通過對本文的學習,掌握動畫設計和分析的思路。本文選自《iOS動畫——核心技術與案例實戰(zhàn)》

  首先先來看看動畫設計中的三個角色:產(chǎn)品設計師、算法分析師以及偉大的程序員都有哪些職責。
(1)產(chǎn)品設計師:告訴大家想做一個什么樣的動畫。
(2)算法分析師:分析動畫的實現(xiàn)原理并設計相應的動畫算法。
(3)程序員:思考如何用代碼實現(xiàn)算法。
  在一般中小規(guī)模的公司中,開發(fā)人員往往都是身兼數(shù)職。不僅要編寫代碼還要參與到算法的設計中去,甚至參與到動畫原型的設計中去。所以弄清楚動畫設計過程中的不同角色,以及搞清楚動畫的分析過程是非常有必要的。

1 動畫分析方法

  下圖是我們想要實現(xiàn)的動畫效果,那么如何來分析它呢?其實產(chǎn)品設計師在設計動畫時,如果能夠將動畫分解為單幀圖像,或者能夠較為慢速地展現(xiàn)動畫的變化過程,那么對于算法分析師和程序員分析動畫的原理,以及設計合適的展現(xiàn)算法起著非常重要的作用。下圖描述了登錄按鈕從左到右逐漸移動的效果,并最后停留在視圖層中間位置這一過程。
動畫分析步驟“三步曲”

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

1.動畫起始階段

  在動畫啟動的瞬間,希望動畫從屏幕可視界面外飛入進來。如下圖所示的登錄按鈕是需要實現(xiàn)的動畫起始位置。
動畫分析步驟“三步曲”
  在iOS視圖中,左上角為視圖的原點(0,0),水平向右為x軸遞增方向,豎直向下為y軸遞增方向,只有當View視圖位于手機屏幕展示坐標系之內,大家才能看到(虛線區(qū)域內控件不可見),否則登錄按鈕是不可見的。所以在動畫的起始階段可以將動畫的位置屬性設置在界面之外。

2.動畫進行階段

  經(jīng)過前面的分析,大家已經(jīng)了解了這個動畫效果的實現(xiàn)算法,即登錄按鈕的坐標沿水平方向隨時間線性變化。如表1.1所示描述了不同時間段登錄按鈕的坐標變化情況。幸運的是大家不需要手動設計這一過程,甚至不需要手動寫線性漸變的方法,因為iOS在UIView的顯示層已經(jīng)幫我們把這個功能集成了。iOS在UIView圖層中不僅集成了動畫的線性漸變方法,而且動畫的加速、減速以及復雜的動畫變化時間函數(shù)、運動路徑函數(shù)也已經(jīng)為大家集成好了,所以只需要學會如何使用這些豐富的API即可,且這個功能只需要幾行代碼就可以實現(xiàn)。
  表1.1 6S下QQ圖標移動效果:QQ圖標x、y坐標隨時間變化關系表
動畫分析步驟“三步曲”

3.動畫結束階段

  在動畫效果結束之后沒有觸發(fā)新的回調事件,只是更新了當前登錄按鈕的最后位置,所以圖片最終停留在視圖層的中間位置。

2 登錄按鈕移動動畫效果:閉包形式

首先創(chuàng)建一個單視圖工程,創(chuàng)建好之后可以看到下圖的工程文件目錄結構:
動畫分析步驟“三步曲”
  動畫實現(xiàn)的第一階段:動畫起始階段
  在開始正式添加動畫代碼之前需要為應用添加一個背景圖片。在Main.storyboard中為整個工程添加一個已經(jīng)準備好的背景圖片,背景圖片依托在UIImageView上。
動畫分析步驟“三步曲”
  上圖為當前工程的Main.storyboard中圖層結構,其中View Controller為整個工程的視圖控制器,login為UIImageView登錄背景圖片。下圖示是準備好的背景圖片,通過下圖可以看出,要想實現(xiàn)最初所示的動畫效果,只需為整個登錄界面添加一個登錄按鈕即可。
動畫分析步驟“三步曲”
  動畫起始階段代碼需要放在什么位置才合適呢?要想弄清楚這個問題先搞清楚ViewController.swift 中幾個方法的執(zhí)行順序。需要關注以下3個方法。

viewDidLoad()viewWillAppear()viewDidAppear()

  在應用啟動之后,在viewDidLoad中會裝載所有的View視圖,注意,雖然所有View視圖都被裝載進來,但是這時所有的View視圖并不是可見的。程序接著調用viewWillAppear方法,這是視圖在展現(xiàn)之前需要調用的方法。而最后調用viewDidAppear,表明所有的視圖已經(jīng)可見。經(jīng)過以上分析,大家應該清楚,在動畫起始階段可以將所有的初始化代碼放置在viewDidLoad()方法中。具體實現(xiàn)代碼如下所示。

1   var loginButton:UIButton?
2   override func viewDidLoad() {
3       super.viewDidLoad()
4       loginButton = UIButton(frame: CGRect(x:-394,y:230,                      width:self.view.frame.width-20*2,height:50))5      loginButton!.backgroundColor = UIColor(red: 50/255.0, green: 185/255.0, blue: 170/255.0, alpha: 1.0)6       loginButton!.setTitle("登錄", for: UIControlState. normal)7      self.view.addSubview(loginButton!)
    }

  代碼第1行創(chuàng)建了一個UIButton登錄按鈕。第3行重寫viewDidLoad方法,表明應用啟動之后首先通過調用viewDidload方法加載各種UI組鍵。第4行設置當前UIButton登錄按鈕的位置,按鈕的x坐標設置在整個界面之外,因此當前Button按鈕是不可見的。第5行為登錄按鈕添加一個淡綠色背景。第6行設置登錄按鈕Title內容。最后一行將按鈕添加到self.view圖層上。
  動畫實現(xiàn)的第二階段和第三階段:動畫進行階段和動畫結束階段
要想實現(xiàn)應用打開動畫即展現(xiàn)的效果,需要在View視圖整體展現(xiàn)之前完成動畫實現(xiàn)的第二階段和第三階段的設置(因為如果視圖已經(jīng)顯示了才設置動畫效果,那么會有動畫不連貫的現(xiàn)象),所以這部分功能只能放置在viewWillAppear方法中。
這里使用的UIButton按鈕和UI控件都是繼承UIView類,UIView類中有一個動畫方法可以完成我們想要實現(xiàn)的功能:

open class func animate(withDuration duration: TimeInterval, animations: @escaping () -> Swift.Void)

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

  • duration:表明動畫執(zhí)行周期。

  • animations:表明動畫執(zhí)行內容。

注意,這里animations是一個閉包,使用閉包的方式將動畫代碼追加進去。在閉包中只需要將動畫的結束狀態(tài)設置完成,那么動畫從開始到結束的中間過程,iOS都會自動實現(xiàn)。下面為viewWillAppear()中的動畫實現(xiàn)代碼。

    override func viewWillAppear(_ animated: Bool) {        UIView.animate(withDuration: 1, animations: {          self.loginButton!.frame = CGRect(x:20,
                y:self.loginButton!.frame.origin.y, 
                 width:self.loginButton!.frame.width, 
                 height:self.loginButton!.frame.height))
        })
    }

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

3 登錄按鈕移動動畫效果:方法形式

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

    override func viewWillAppear(animated: Bool) {1        UIView.beginAnimations(nil, context: nil)//動畫開始2        UIView.setAnimationDuration(1)//動畫周期設置3        loginButton!.frame = CGRect(x:20,
               y:loginButton!.frame.origin.y,
               width:loginButton!.frame.width,
               height:loginButton!.frame.height)//動畫位置設置4       UIView.commitAnimations()//動畫提交
    }

  代碼第1行表明動畫開始,這里先忽略需要傳遞的參數(shù),可以先傳遞兩個nil。第2行設置動畫執(zhí)行周期,這里將動畫周期設置為1s。第3行將登錄按鈕設置在屏幕中間位置。代碼最后一行將動畫效果提交到系統(tǒng)上運行。
  其實無論是第2節(jié)的動畫實現(xiàn)方法抑或是第3節(jié)的動畫實現(xiàn)方法,都可以把動畫實現(xiàn)的過程總結為下面的3個步驟。
動畫分析步驟“三步曲”
  而第2節(jié)和第3節(jié)實現(xiàn)動畫的唯一區(qū)別就是一個使用閉包的形式,而另一個使用beginAnimations和commitAnimations方法的形式啟動動畫。

4 UIView視圖中常見動畫的屬性分析

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

1.位置屬性:frame bounds center

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

public struct CGRect {    public var origin: CGPoint
    public var size: CGSize
    public init()    public init(origin: CGPoint, size: CGSize)
}

  再來看看三者的數(shù)據(jù)類型。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中數(shù)據(jù)類型的追本溯源,可以得到以下結論:CGRect分別對應x坐標、y坐標、width、height四個屬性。這四個屬性表明當前UI在它的父控件上的位置,如self.view上。
  通過以上分析可以知道,可以通過x、y坐標修改UIView的移動位置,還可以通過修改width或者height來修改UIView的拉伸、收縮效果。對于bounds屬性使用最多的還是width、height屬性,center則經(jīng)常使用x、y坐標屬性。

2.透明度屬性:alpha(透明度屬性、范圍0-1、浮點型)

  UIView的alpha透明度屬性也可以用作動畫效果。當alpha為0時,表明UIView已經(jīng)隱藏,當alpha為1時UIView顯示。結合這一特征可以通過修改alpha在動畫開始、結束時的值,實現(xiàn)UIView的淡入淡出效果。

3.Layer屬性:圓角漸變、邊框顏色、陰影、3D等高級動畫效果

  UIView是視圖顯示的容器,負責內容顯示和事件響應。每個UIView都有一個Layer圖層,在這個圖層中承載的是視圖的內容,所以結合Layer可以實現(xiàn)很多高級的動畫效果。當然除了這些之外,UIView還有很多其他屬性,在后面的章節(jié)中會為大家一一呈現(xiàn)。

5 小結

  通過對本文的學習,相信大家基本上掌握了動畫分析的基本步驟,在這里總結一下動畫實現(xiàn)的三個步驟:
(1)設置視圖的動畫初始狀態(tài)。
(2)添加視圖的動畫相應屬性。
(3)設置視圖的動畫最終狀態(tài)。
  在通過幀分解等方法了解了動畫的實現(xiàn)原理之后,通過這三個步驟可以很方便地實現(xiàn)各種動畫效果。本章結合登錄按鈕移動效果為大家展示了動畫分析和實現(xiàn)的全過程,并通過代碼詳細介紹了通過閉包方式,以及beginAnimations和commitAnimations方法的形式實現(xiàn)動畫。
  對于UIView中常見的動畫屬性,結合UIView對視圖的位置、透明度、幾何形狀給大家做了簡要的分析,在后面的章節(jié)中會結合具體的代碼,為大家呈現(xiàn)繽紛多彩的動畫效果。
  本文選自《iOS動畫——核心技術與案例實戰(zhàn)》,點此鏈接可在博文視點官網(wǎng)查看。
                      動畫分析步驟“三步曲”
  想及時獲得更多精彩文章,可在微信中搜索“博文視點”或者掃描下方二維碼并關注。
                       動畫分析步驟“三步曲”


向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內容。

AI