在上一次時候官疲,我們講解了幀動畫和補間動畫搂漠,尤其是補間動畫迂卢,有一個小問題不知道大家發(fā)現(xiàn)沒有:
舉個簡單的例子,我們把一個圖片設(shè)置點擊事件状答,讓他吐司冷守。然后我們給他設(shè)置縮放,讓他縮放到0,0(就是消失)惊科,然后我們再點擊,看看會怎么樣:
我們發(fā)現(xiàn)我們把他變道最小了亮钦,點擊它原來的位置還是會吐司的馆截。相信有人已經(jīng)猜到今天我們要講什么了,沒錯蜂莉,我們?nèi)绻胍屗s放了以后點擊原來的位置不會吐司蜡娶,那么我們只需要用屬性動畫來實現(xiàn)這個功能就好了。
屬性動畫:
我們首先來對比一下屬性動畫和補間動畫的區(qū)別:
很明顯了映穗,補間動畫知識改變了View顯示效果窖张,如位置變化,大小比例變化蚁滋,旋轉(zhuǎn)宿接,透明度變化,但是他只是從顯示上改變了這些辕录,而實際上相關(guān)聯(lián)的控件(Button睦霎、ImageView等View控件)他們的大小,位置走诞,旋轉(zhuǎn)角度副女,透明度這些屬性還是沒有變化的。
而屬性動畫就不一樣了蚣旱,我們每一次動畫所改變的效果碑幅,都是直接改變的View的相關(guān)屬性戴陡。
我們上一次學(xué)了補間動畫,現(xiàn)在學(xué)習(xí)屬性動畫的話會相對輕松點沟涨,其實還是對應(yīng)的那四種變換加上組合變換恤批,都是固定的邏輯。下面我們一起來看一下:
首先我們還是設(shè)置一下布局:
一張圖片拷窜,一個按鈕實現(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ù):
他有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)矛物。
首先我們要創(chuàng)建一個名為animator的目錄文件,然后在里面創(chuàng)建一個叫做anim_alpha的文件跪但。
<objectAnimator
????android:propertyName="alpha"
? ? android:valueFrom="1"
? ? android:valueTo="0"
? ? android:duration="3000"
? ? android:repeatCount="1">
<objectAnimator/>
我們把頭標(biāo)簽市值為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):
屬性動畫組合對應(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í)行。