Android 屬性動畫原理與DataBinding
Android 屬性動畫原理與DataBinding
看到這個標(biāo)題的時候你可能會有疑問,屬性動畫和 DataBinding 之間有什么關(guān)系?我個人理解的是:它們內(nèi)部的實(shí)現(xiàn)思想有相似之處。這篇文章主要對 Android 屬性動畫的知識通過文字進(jìn)行整理記錄,內(nèi)容參考于《Android開發(fā)藝術(shù)探索》,在最后會給出我如此理解屬性動畫和 DataBinding 的原因。
Android動畫概述:
Android 的動畫可以分為三種:View 動畫、幀動畫和屬性動畫,View 動畫通過對場景里的對象不斷做圖像變化(平移、縮放、旋轉(zhuǎn)、透明度)從而產(chǎn)生動畫效果,View 動畫支持自定義。幀動畫通過順序播放一系列圖像產(chǎn)生動畫效果,可以簡單理解為圖片切換動畫,圖片過大會導(dǎo)致 OOM。屬性動畫通過動態(tài)的改變對象的屬性從而達(dá)到動畫效果,屬性動畫為API 11的新特性,在低版本需要通過兼容庫來使用它。
屬性動畫:
屬性動畫可以對任意對象的屬性進(jìn)行動畫而不僅僅是 View,在一個時間間隔內(nèi)可以完成對象從一個屬性值到另一個屬性值的改變。因此屬性動畫幾乎是無所不能的,只要對象有這個屬性,它都能實(shí)現(xiàn)動畫效果。、
使用:
屬性動畫中有 ValueAnimator 、ObjectAnimator 和 AnimatorSet 等概念,其中 ObjectAnimator 繼承自 ValueAnimator,用來是實(shí)現(xiàn)一個屬性動畫,AnimatorSet 是動畫集合,可以定義一組動畫,它們使用起來是及其簡單的,在此不再舉例。屬性動畫除了通過代碼實(shí)現(xiàn)以外,同View動畫一樣,也可以通過XML來定義,屬性動畫需要定義在res/animator目錄下,其中的 set、objectAnimator 和 animator 標(biāo)簽分別對應(yīng) AnimatorSet、ObjectAnimator 和 ValueAnimator 。盡管屬性動畫可以通過XML來實(shí)現(xiàn),但在實(shí)際開發(fā)中往往會采用代碼來實(shí)現(xiàn),因?yàn)楹芏鄷r候一個屬性的起始值是無法提前確定的。
插值器和估值器:
TimeInterpolator 譯為時間插值器,它的作用是根據(jù)時間流逝的百分比來計(jì)算出當(dāng)前屬性值改變的百分比,系統(tǒng)預(yù)置的有 LinearInterpolator (線性插值器:勻速動畫)、 AccelerateDecelerateInterpolator (加速減速插值器:動畫兩頭慢中間快)和 DecelerateInterpolator (減速插值器:動畫越來越慢)等。
TypeEvaluator 譯為類型估值算法,也叫估值器,它的作用是根據(jù)當(dāng)前屬性改變的百分比來計(jì)算改變后的屬性值,系統(tǒng)預(yù)置的有 IntEvaluator (針對整型屬性)、 FloatEvaluator (針對浮點(diǎn)型屬性)和ArgbEvaluator (針對 Color 屬性)。屬性動畫中的插值器( Interpolator )和估值器( TypeEvaluator )很重要,它們是實(shí)現(xiàn)非勻速動畫的重要手段。
屬性動畫的監(jiān)聽器:
屬性動畫提供了監(jiān)聽器來監(jiān)聽動畫的播放過程,主要有AnimatorUpdateListener 和 AnimatorListener 。AnimatorListener 可以監(jiān)聽動畫的開始、結(jié)束、取消以及重復(fù)播放 ,同時為了方便開發(fā),系統(tǒng)還提供了 AnimatorListenerAdapter 這個類,他是 AnimatorListener 的適配器類, 可以有選擇的實(shí)現(xiàn)這四個監(jiān)聽方法。AnimatorUpdateListener 比較特殊,他會監(jiān)聽整個動畫過程, 動畫是由許多幀組成的,每播放一幀對應(yīng)監(jiān)聽方法就會被調(diào)用一次。
對任意屬性做動畫:
屬性動畫可以對任意屬性添加動畫效果,假如我們要給一個 button 加一個動畫,讓這個 button 的寬度增加 100px,我們可能會這樣寫:
@Override public void onClick(View v){ ObjectAnimator.ofInt(v,"width",100).setDuration(1000).start(); }
但是當(dāng)點(diǎn)擊按鈕后并沒有效果,不是說好的可以對任意屬性實(shí)現(xiàn)動畫嘛,其實(shí)沒效果是對的,下面分析屬性動畫的原理:屬性動畫要求動畫作用的對象提供該屬性的 get 和 set 方法,屬性動畫根據(jù)外界傳遞的該屬性的初始值和最終值,以動畫的效果多次去調(diào)用 set 方法,每次傳遞給 set 方法的值都不一樣,確切的來說是隨著時間的推移,所傳遞的值越來越接近最終值。總結(jié)一下,我們對 object 的屬性 abc 做動畫,如果想讓動畫生效,要同時滿足以下兩個條件:
1.object 必須提供 setAbc 方法,如果動畫的時候沒有傳遞初始值,那么還要提供 getAbc 方法,因?yàn)橄到y(tǒng)要去取 abc 屬性的初始值(若這條不滿足,程序直接 Crash)
2.object 的 setAbc 對屬性 abc 所做的改變必須能夠通過某種方法反映出來,比如會帶來 UI 的改變之類的(如果這條不滿足,動畫無效果但不會Crash)
這跟 DataBinding 中的思想是一樣的,這里的object對應(yīng)于DataBinding中的 ViewModel,ViewModel 的成員變量 set 方法中需要提醒 DataBinding 去更新 view 的內(nèi)容,如下:
public void setName(String name) { this.name = name; notifyPropertyChanged(BR.name); }
針對以上問題,官方文檔告訴我們有3種解決方法:
- 給你的對象加上 get 和 set 方法,如果有權(quán)限的話
- 用一個類來包裝原始對象,間接為其提供 get 和 set 方法
- 采用 ValueAnimator,監(jiān)聽動畫過程,自己實(shí)現(xiàn)屬性的改變
感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
相關(guān)文章
Android 解決嵌套Fragment無法接收onCreateOptionsMenu事件的問題
本文主要介紹Android Fragment無法接收onCreateOptionsMenu事件的問題,這里給出解決辦法以及詳細(xì)代碼,希望能幫助有需要的小伙伴2016-07-07Android ListView的OnItemClickListener詳解
這篇文章主要介紹了Android ListView的OnItemClickListener詳解的相關(guān)資料,涉及到OnItemClickListener的position和id參數(shù)做詳細(xì)的解釋的知識點(diǎn),非常不錯,具有參考借鑒價值,需要的朋友參考下2016-07-07Android實(shí)現(xiàn)點(diǎn)擊WebView界面中圖片滑動瀏覽與保存圖片功能
大家在日常使用spp流量文章的時候經(jīng)常會遇到這樣的一個功能,點(diǎn)擊文章的圖片進(jìn)入圖片的瀏覽模式,可以左右滑動圖片瀏覽,并且可以實(shí)現(xiàn)保存圖片的功能,所以本文主要就介紹了在Android如何實(shí)現(xiàn)點(diǎn)擊WebView界面中圖片滑動瀏覽與保存圖片功能,需要的朋友可以參考下。2017-04-04Android studio配置lambda表達(dá)式教程
Java 8的一個大亮點(diǎn)是引入Lambda表達(dá)式,使用它設(shè)計(jì)的代碼會更加簡潔。接下來通過本文給大家介紹Android studio配置lambda表達(dá)式教程,需要的朋友參考下吧2017-05-05