您好,登錄后才能下訂單哦!
今天就跟大家聊聊有關Android應用中實現屬性動畫的原理是什么,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結了以下內容,希望大家根據這篇文章可以有所收獲。
Android動畫概述:
Android 的動畫可以分為三種:View 動畫、幀動畫和屬性動畫,View 動畫通過對場景里的對象不斷做圖像變化(平移、縮放、旋轉、透明度)從而產生動畫效果,View 動畫支持自定義。幀動畫通過順序播放一系列圖像產生動畫效果,可以簡單理解為圖片切換動畫,圖片過大會導致 OOM。屬性動畫通過動態的改變對象的屬性從而達到動畫效果,屬性動畫為API 11的新特性,在低版本需要通過兼容庫來使用它。
屬性動畫:
屬性動畫可以對任意對象的屬性進行動畫而不僅僅是 View,在一個時間間隔內可以完成對象從一個屬性值到另一個屬性值的改變。因此屬性動畫幾乎是無所不能的,只要對象有這個屬性,它都能實現動畫效果。、
使用:
屬性動畫中有 ValueAnimator 、ObjectAnimator 和 AnimatorSet 等概念,其中 ObjectAnimator 繼承自 ValueAnimator,用來是實現一個屬性動畫,AnimatorSet 是動畫集合,可以定義一組動畫,它們使用起來是及其簡單的,在此不再舉例。屬性動畫除了通過代碼實現以外,同View動畫一樣,也可以通過XML來定義,屬性動畫需要定義在res/animator目錄下,其中的 set、objectAnimator 和 animator 標簽分別對應 AnimatorSet、ObjectAnimator 和 ValueAnimator 。盡管屬性動畫可以通過XML來實現,但在實際開發中往往會采用代碼來實現,因為很多時候一個屬性的起始值是無法提前確定的。
插值器和估值器:
TimeInterpolator 譯為時間插值器,它的作用是根據時間流逝的百分比來計算出當前屬性值改變的百分比,系統預置的有 LinearInterpolator (線性插值器:勻速動畫)、 AccelerateDecelerateInterpolator (加速減速插值器:動畫兩頭慢中間快)和 DecelerateInterpolator (減速插值器:動畫越來越慢)等。
TypeEvaluator 譯為類型估值算法,也叫估值器,它的作用是根據當前屬性改變的百分比來計算改變后的屬性值,系統預置的有 IntEvaluator (針對整型屬性)、 FloatEvaluator (針對浮點型屬性)和ArgbEvaluator (針對 Color 屬性)。屬性動畫中的插值器( Interpolator )和估值器( TypeEvaluator )很重要,它們是實現非勻速動畫的重要手段。
屬性動畫的監聽器:
屬性動畫提供了監聽器來監聽動畫的播放過程,主要有AnimatorUpdateListener 和 AnimatorListener 。AnimatorListener 可以監聽動畫的開始、結束、取消以及重復播放 ,同時為了方便開發,系統還提供了 AnimatorListenerAdapter 這個類,他是 AnimatorListener 的適配器類, 可以有選擇的實現這四個監聽方法。AnimatorUpdateListener 比較特殊,他會監聽整個動畫過程, 動畫是由許多幀組成的,每播放一幀對應監聽方法就會被調用一次。
對任意屬性做動畫:
屬性動畫可以對任意屬性添加動畫效果,假如我們要給一個 button 加一個動畫,讓這個 button 的寬度增加 100px,我們可能會這樣寫:
@Override public void onClick(View v){ ObjectAnimator.ofInt(v,"width",100).setDuration(1000).start(); }
但是當點擊按鈕后并沒有效果,不是說好的可以對任意屬性實現動畫嘛,其實沒效果是對的,下面分析屬性動畫的原理:屬性動畫要求動畫作用的對象提供該屬性的 get 和 set 方法,屬性動畫根據外界傳遞的該屬性的初始值和最終值,以動畫的效果多次去調用 set 方法,每次傳遞給 set 方法的值都不一樣,確切的來說是隨著時間的推移,所傳遞的值越來越接近最終值。總結一下,我們對 object 的屬性 abc 做動畫,如果想讓動畫生效,要同時滿足以下兩個條件:
1.object 必須提供 setAbc 方法,如果動畫的時候沒有傳遞初始值,那么還要提供 getAbc 方法,因為系統要去取 abc 屬性的初始值(若這條不滿足,程序直接 Crash)
2.object 的 setAbc 對屬性 abc 所做的改變必須能夠通過某種方法反映出來,比如會帶來 UI 的改變之類的(如果這條不滿足,動畫無效果但不會Crash)
這跟 DataBinding 中的思想是一樣的,這里的object對應于DataBinding中的 ViewModel,ViewModel 的成員變量 set 方法中需要提醒 DataBinding 去更新 view 的內容,如下:
public void setName(String name) { this.name = name; notifyPropertyChanged(BR.name); }
針對以上問題,官方文檔告訴我們有3種解決方法:
看完上述內容,你們對Android應用中實現屬性動畫的原理是什么有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注億速云行業資訊頻道,感謝大家的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。