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