2018-04-21—屬性動畫(1) 初步認識ObjectAnimator

在上一次時候,我們講解了幀動畫和補間動畫,尤其是補間動畫,有一個小問題不知道大家發(fā)現(xiàn)沒有:

舉個簡單的例子,我們把一個圖片設(shè)置點擊事件,讓他吐司。然后我們給他設(shè)置縮放,讓他縮放到0,0(就是消失),然后我們再點擊,看看會怎么樣:


我們發(fā)現(xiàn)我們把他變道最小了,點擊它原來的位置還是會吐司的。相信有人已經(jīng)猜到今天我們要講什么了,沒錯,我們?nèi)绻胍屗s放了以后點擊原來的位置不會吐司,那么我們只需要用屬性動畫來實現(xiàn)這個功能就好了。


屬性動畫:

我們首先來對比一下屬性動畫和補間動畫的區(qū)別:


補間動畫和屬性動畫區(qū)別

很明顯了,補間動畫知識改變了View顯示效果,如位置變化,大小比例變化,旋轉(zhuǎn),透明度變化,但是他只是從顯示上改變了這些,而實際上相關(guān)聯(lián)的控件(Button、ImageView等View控件)他們的大小,位置,旋轉(zhuǎn)角度,透明度這些屬性還是沒有變化的。

而屬性動畫就不一樣了,我們每一次動畫所改變的效果,都是直接改變的View的相關(guān)屬性。

我們上一次學(xué)了補間動畫,現(xiàn)在學(xué)習(xí)屬性動畫的話會相對輕松點,其實還是對應(yīng)的那四種變換加上組合變換,都是固定的邏輯。下面我們一起來看一下:

首先我們還是設(shè)置一下布局:

xml布局

一張圖片,一個按鈕實現(xiàn)點擊效果。


Java實現(xiàn):

平移:

屬性動畫跟補間動畫不一樣,它對應(yīng)的類有一個叫做ObjectAnimation的類(還有一個ValueAnimation這個下次再說),這個類可以實現(xiàn)我們四種變換方式。我們來上一下代碼大家就都清楚了:

ObjectAnimator animatorT = ObjectAnimator.ofFloat(img,"translationX",0,100);

animatorT.setDuration(2000);

animatorT.start();

我們新建了一個叫做ObjectAnimator的對象,這個對象就是我們所說的屬性動畫其中一個類,我們通過它里面的靜態(tài)方法ofFloat方法來獲取對象,我們看一下里面的參數(shù):

ofFloat方法參數(shù)

他有5個構(gòu)造方法,我們只看第一個,也是我們最常用的一個

第一個參數(shù)是我們要綁定的控件對象,我們綁定img,就是讓img控件進行一系列操作,

第二個參數(shù)是變換類型,這里面有這么幾個參數(shù)

我們剛才讓他進行了x軸方向向右移動100的操作,所以屬性名字里面寫的是translationX。


最后一個參數(shù)是可變長參數(shù),這個我們后面寫多少參數(shù)都可以,在上面我只寫了0,100兩個,他的意思是x軸起始位置是偏移量0,x軸結(jié)束位置是偏移量100。

如果我在里面再加一個0,那么他會先向右平移100,然后又回到原位。也就是說我們在里面添加多少數(shù)據(jù),他就會依次執(zhí)行。

可能有的同學(xué)會問了,這個沒有設(shè)置fillAfter啊,他怎么結(jié)束后保留了最后樣式?這就是我們屬性動畫和補間動畫的區(qū)別了,我們屬性動畫在收到我們的數(shù)值之后,是直接改變了我們的位置,而不僅僅是動畫效果。


2.旋轉(zhuǎn)

不多說,我們直接上代碼:

ObjectAnimator animatorR = ObjectAnimator.ofFolat(img,"Rotation",0,360,180);

animatorR.setDuration(3000);

animatorR.start();

有了上面的例子,大家這個應(yīng)該都可以看懂的吧,我們綁定了img控件,然后讓他的旋轉(zhuǎn)軸為垂直屏幕方向,然后先轉(zhuǎn)動到順時針360的方向上,然后又轉(zhuǎn)回剛才180的方向上,總共轉(zhuǎn)動時間為3秒。

那么關(guān)于縮放和透明度也是同樣的道理,在這里就不多說了。



XML實現(xiàn):

這個跟補間動畫一樣,我們同樣可以通過xml來實現(xiàn)。


animator目錄

首先我們要創(chuàng)建一個名為animator的目錄文件,然后在里面創(chuàng)建一個叫做anim_alpha的文件。

<objectAnimator

????android:propertyName="alpha"

? ? android:valueFrom="1"

? ? android:valueTo="0"

? ? android:duration="3000"

? ? android:repeatCount="1">

<objectAnimator/>

我們把頭標簽市值為objectAnimator。

然后在里面加入相關(guān)屬性。

ObjectAnimator animatorT = (ObjectAnimator) AnimatorInflater.loadAnimator(this,R.animator.animator_alpha);

animatorT.setTarget(img);

animatorT.start();

我們通過AnimatorInflater類的loadAnimator方法來獲取我們剛才的xml文件。我們來看一下效果:


漸變效果

關(guān)于其他的三種xml實現(xiàn)也是同樣的道理。

下面我們來看一下如何實現(xiàn)屬性動畫的組合:



屬性動畫組合:

1.java實現(xiàn):


AnimatorSet類

屬性動畫組合對應(yīng)的是AnimatorSet類,我們只需要new他就好。

它對應(yīng)的主要有這四個方法,play,before,with,after。這四個方法里面全都是填入往后兒們的animator類,但是先后執(zhí)行順序不一樣,分別對應(yīng)著開啟,最后,同步,最開始執(zhí)行。

我們來看一下效果:



我們注意到他是先執(zhí)行的after,然后是play和with同時執(zhí)行,最后執(zhí)行的before。所以大家記住這個順序,無論怎么寫,都是這個執(zhí)行順序。

2.XML實現(xiàn)


xml相對于java代碼實現(xiàn)組合,就輕松多了,下面的一些屬性大家都可以看懂,我這里只強調(diào)一下ordering這個屬性,這個屬性有兩個值:together是同步,而sequentially是按照我們寫入的順序依次執(zhí)行。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容