這是我這個(gè)系列的目錄纷责,有興趣的可以看下: android 動(dòng)畫(huà)系列 - 目錄
我的一貫原則,先上圖看了再說(shuō):
android 視圖動(dòng)畫(huà)這塊其實(shí) 挺有意思的撼短,應(yīng)用的也是挺多的再膳,效果就是在一個(gè)頁(yè)面啟動(dòng)后,頁(yè)面中的元素挨個(gè)執(zhí)行入場(chǎng)動(dòng)畫(huà)曲横,看著挺唬人的喂柒。簡(jiǎn)單來(lái)說(shuō)就是可以在 ViewGroup 的添加一個(gè)入場(chǎng)動(dòng)畫(huà),這個(gè) ViewGroup 的所有子元素都會(huì)按照你設(shè)計(jì)的順序執(zhí)行一遍動(dòng)畫(huà)胜榔,至于子元素的范圍目測(cè)是直接子元素才行胳喷,關(guān)于這塊的內(nèi)容其實(shí)挺老的,android 在很早就已經(jīng)支持了夭织,但是這塊知識(shí)點(diǎn)算是冷門(mén)吭露,詳細(xì)學(xué)習(xí)過(guò)的人應(yīng)該不多。
視圖動(dòng)畫(huà)分3種:
- layoutAnimation
- gridLayoutAnimation
- animateLayoutChanges
- LayoutTransition
哈哈尊惰,說(shuō)起 layoutAnimation 學(xué)習(xí)過(guò)的人應(yīng)該有不少讲竿,但是說(shuō)起后幾個(gè)想必學(xué)習(xí)過(guò)的人就不多了,當(dāng)然了從后幾種使用的機(jī)會(huì)不是很多弄屡。
區(qū)別
layoutAnimation:
layoutAnimation 是在 ViewGroup 創(chuàng)建之后题禀,顯示時(shí)作用的,作用時(shí)間是:ViewGroup 的首次創(chuàng)建顯示膀捷,之后再有改變就不行了迈嘹。
動(dòng)畫(huà)只能使用 tween 動(dòng)畫(huà)gridLayoutAnimation:
是給網(wǎng)格布局使用的,現(xiàn)在 gridLayoutAnimation 也不用了全庸,這個(gè)大家就不用看了秀仲,想詳細(xì)看也沒(méi)事,看最下面的參考資料
動(dòng)畫(huà)只能使用 tween 動(dòng)畫(huà)animateLayoutChanges:
這是在 ViewGroup 創(chuàng)建顯示之后壶笼,內(nèi)容改變時(shí)對(duì)于新的內(nèi)容做動(dòng)畫(huà)神僵,和 layoutAnimation 是配合使用的。LayoutTransition:
這個(gè)作用范圍 = layoutAnimation + animateLayoutChanges覆劈。這個(gè)大家看源碼應(yīng)該可以看到保礼,一般我是沒(méi)看見(jiàn)有人用這個(gè)沛励。這個(gè)這里我就不說(shuō)了,同樣的炮障,詳細(xì)在下面的參考資料里
動(dòng)畫(huà)只能使用屬性動(dòng)畫(huà)
layoutAnimation
layoutAnimation 是我們使用最多的了目派,他可以賦予頁(yè)面一種頁(yè)面展開(kāi)的交互效果,當(dāng)然他也是有限制的胁赢,只能給子 view提供統(tǒng)一的動(dòng)畫(huà)效果址貌,而不能給不同的 view 賦予不同的動(dòng)畫(huà)效果,這種需求就只能自己手動(dòng)挨個(gè) view寫(xiě)了徘键,實(shí)際還是使用 layoutAnimation的,除非產(chǎn)品腦洞大開(kāi)...哈哈哈~~
layoutAnimation最大的優(yōu)點(diǎn)就是使用簡(jiǎn)單遍蟋,google 提供了2種方式吹害,xml 和代碼,先來(lái)說(shuō) xml 的方式
** xml 實(shí)現(xiàn) layoutAnimation**
步奏有3:
- 先寫(xiě)一個(gè) tween 動(dòng)畫(huà) xml
- 在寫(xiě)一個(gè)專門(mén)的 layoutAnimation xml 文件
- 最后給根節(jié)點(diǎn)的 viewGroup 設(shè)置上這個(gè)你定義的 layoutAnimation
** layoutAnimation xml 定義:**
<?xml version="1.0" encoding="utf-8"?>
<layoutAnimation xmlns:android="http://schemas.android.com/apk/res/android"
android:animation="@anim/tran_left"
android:animationOrder="normal"
android:delay="0.3"
/>
屬性參數(shù)很簡(jiǎn)單虚青,沒(méi)幾個(gè)
- animation 是你指定的動(dòng)畫(huà)
- animationOrder 是子元素動(dòng)畫(huà)的順序它呀,有三種選項(xiàng):nomal丶reverse丶和random,其中normal表示順序顯示棒厘,reverse表示逆向顯示纵穿,random則表示隨機(jī)播放入場(chǎng)動(dòng)畫(huà)。
- delay 是子元素開(kāi)始動(dòng)畫(huà)的時(shí)間延遲奢人,比如子元素入場(chǎng)動(dòng)畫(huà)的時(shí)間周期為300ms谓媒,那么0.5就代表每個(gè)子元素都需要延遲150ms才能播放入場(chǎng)動(dòng)畫(huà)『魏酰總體來(lái)說(shuō)句惯,第一個(gè)子元素延遲150ms開(kāi)始播放入場(chǎng)動(dòng)畫(huà),第二個(gè)子元素延遲300ms開(kāi)始播放入場(chǎng)動(dòng)畫(huà)支救,依次類推抢野。
這里使用的動(dòng)畫(huà) xml 如下:
<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="500"
android:fromYDelta="100%p"
android:toYDelta="0"
/>
好了到最后了,給根視圖節(jié)點(diǎn)設(shè)置上就行了:
效果圖:
注意一點(diǎn)這是在啟動(dòng)頁(yè)面上添加的效果各墨,要是我們不再啟動(dòng)頁(yè)上添加而放在另一個(gè)頁(yè)面呢指孤,速度上會(huì)不會(huì)有不同呢
非啟動(dòng)頁(yè)效果圖:
實(shí)測(cè)有時(shí)候會(huì)在卡第一個(gè)和第二個(gè) textview,之后的沒(méi)事贬堵,有時(shí)候不會(huì)卡恃轩,我的機(jī)器配置還算不錯(cuò),也沒(méi)開(kāi)別的軟件扁瓢,具體還是聽(tīng)見(jiàn)下面的 代碼生成 layoutAnimation 的方式
** 代碼實(shí)現(xiàn) layoutAnimation**
我覺(jué)得使用代碼生成 layoutAnimation 比在 xml 里設(shè)置要好些详恼,用代碼的方式?jīng)]有再遇到卡的問(wèn)題了,我們?cè)?view 渲染完后再給他設(shè)置
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
rootView = (ViewGroup) findViewById(R.id.activity_main);
rootView.post(new Runnable() {
@Override
public void run() {
// 添加布局動(dòng)畫(huà)
addLayoutAnimation(rootView);
}
});
}
private void addLayoutAnimation(ViewGroup view) {
Animation animation = AnimationUtils.loadAnimation(this, R.anim.tran_left);
LayoutAnimationController layoutAnimationController = new LayoutAnimationController(animation);
layoutAnimationController.setDelay(0.3f);
layoutAnimationController.setOrder(LayoutAnimationController.ORDER_NORMAL);
view.setLayoutAnimation(layoutAnimationController);
view.setLayoutAnimationListener(new Animation.AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {
}
@Override
public void onAnimationEnd(Animation animation) {
Toast.makeText(MainActivity.this, "end!!!", Toast.LENGTH_SHORT).show();
}
@Override
public void onAnimationRepeat(Animation animation) {
}
});
}
還可以設(shè)置監(jiān)聽(tīng)動(dòng)畫(huà)哦引几,這是代碼方式的效果圖:
大家注意哦昧互,用代碼的方式就不能在 xml 里設(shè)置了哦挽铁!
animateLayoutChanges
animateLayoutChanges 這個(gè)是在 ViewGroup 內(nèi)容改變的時(shí)候?qū)τ诟淖兊牟糠肿鰟?dòng)畫(huà),使用起來(lái)很簡(jiǎn)單敞掘,在你需要顯示動(dòng)畫(huà)的 view xml 節(jié)點(diǎn)上設(shè)置 android:animateLayoutChanges="true" 就可以了叽掘,和 layoutAnimation 在使用上不沖突,不管是 xml 還是代碼的方式都不沖突玖雁。但是這個(gè) animateLayoutChanges 你不能指定動(dòng)畫(huà)更扁,使用使用系統(tǒng)默認(rèn)提供的淡入淡出的動(dòng)畫(huà)效果,先來(lái)看下效果圖:
頁(yè)面的中間有一個(gè)線性布局赫冬,往里添加一些 view 進(jìn)去浓镜,代碼很簡(jiǎn)單我就不貼了,大伙看看圖感受一下就 ok 了劲厌。有簡(jiǎn)單就有復(fù)雜膛薛,你要是想指定 viewGroup 內(nèi)容改變時(shí)的動(dòng)畫(huà)可以去看 LayoutTransition 這塊,提哦那個(gè)樣這部分代碼在下面的參考資料里补鼻,我就不說(shuō) LayoutTransition 了哄啄,要是說(shuō)起來(lái)東西比較多,估計(jì)我也說(shuō)不大好风范,還是看看比較好的資料把