Android Activity和Fragment的轉場動畫。
Android Activity和Fragment的轉場動畫
Activity轉場動畫
Activity的轉場動畫是通過overridePendingTransition(int enterAnim, int exitAnim)實作的。
這個方法是API Level 5 加入的。
這個方法在
startActivity(Intent)
or
finish()
之後被調用,指定接下來的這個轉場動畫。
方法的第一個參數:enterAnim,是新的Activity的進入動畫的resource ID;
第二個參數exitAnim,是舊的Activity(目前的Activity)離開動畫的resource ID。
是以這兩個參數的對象是兩個Activity。
如果上面兩個參數沒有動畫要設定,則用0作為參數。
動畫的資源檔案放在res\anim\目錄下,是View Animation。
參見本部落格博文:Android Animation學習(六) View Animation介紹
View Animation包含了基本的動畫類型,基本可以滿足一般轉場動畫的需要。
根節點可以是:<alpha>, <scale>, <translate>, <rotate>, interpolator element, 或者是<set>。
利用set可以進行各種嵌套組合。
代碼例子:
Intent intent = new Intent(TestActivities.this,TestActivityFirst.class);
startActivity(intent);
// transaction animation
overridePendingTransition(R.anim.slide_in_bottom,R.anim.slide_out_bottom);
其中兩個動畫:
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate android:fromYDelta="100%p" android:toYDelta="0"
android:duration="2000"/>
<alpha android:fromAlpha="0.0" android:toAlpha="1.0"
android:duration="2000" />
</set>
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate android:fromYDelta="0%p" android:toYDelta="100%p"
android:duration="2000"/>
<alpha android:fromAlpha="1.0" android:toAlpha="0.0"
android:duration="2000" />
</set>
Fragment轉場動畫
Fragment的轉場動畫實作分為使用v4包和不使用v4包兩種情況,不使用v4包的話,最低API Level需要是11。
标準轉場動畫:
可以給Fragment指定标準的轉場動畫,通過setTransition(int transit)方法。
該方法可傳入的三個參數是:
TRANSIT_NONE,
TRANSIT_FRAGMENT_OPEN,
TRANSIT_FRAGMENT_CLOSE
分别對應無動畫、打開形式的動畫和關閉形式的動畫。
标準動畫設定好後,在Fragment添加和移除的時候都會有。
自定義轉場動畫
自定義轉場動畫是通過setCustomAnimations()方法,因為Fragment添加時可以指定加入到Back Stack中,是以轉場動畫有添加、移除、從Back stack中pop出來,還有進入四種情況。
注意setCustomAnimations()方法必須在add、remove、replace調用之前被設定,否則不起作用。
android.app.Fragment
類參考:
Fragment:http://developer.android.com/reference/android/app/Fragment.html
FragmentTransaction:http://developer.android.com/reference/android/app/FragmentTransaction.html
不使用v4包的情況下(min API >=11)所對應的動畫類型是Property Animation。
即動畫資源檔案需要放在res\animator\目錄下,且根标簽是<set>, <objectAnimator>, or <valueAnimator>三者之一。
這一點也可以從Fragment中的這個方法看出:onCreateAnimator(int transit, boolean enter, int nextAnim),傳回值是Animator。
自定義轉場動畫時,四個參數的形式setCustomAnimations (int enter, int exit, int popEnter, int popExit)是API Level 13才有的,11隻引入了兩個動畫的形式,即無法指定Back Stack棧操作時的轉場動畫。
private void addFragment() {
if (null == mFragmentManager) {
mFragmentManager = getFragmentManager();
}
mTextFragmentOne = new MyFragmentOne();
FragmentTransaction fragmentTransaction = mFragmentManager
.beginTransaction();
// 标準動畫
// fragmentTransaction
// .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
// fragmentTransaction
// .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
// fragmentTransaction
// .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_CLOSE);
// 自定義動畫
// API LEVEL 11
fragmentTransaction.setCustomAnimations(
R.animator.fragment_slide_left_enter,
R.animator.fragment_slide_right_exit);
// API LEVEL 13
// fragmentTransaction.setCustomAnimations(
// R.animator.fragment_slide_left_enter,
// R.animator.fragment_slide_left_exit,
// R.animator.fragment_slide_right_enter,
// R.animator.fragment_slide_right_exit);
fragmentTransaction.add(R.id.container, mTextFragmentOne);
// 加入到BackStack中
fragmentTransaction.addToBackStack(null);
fragmentTransaction.commit();
}
其中四個動畫是從ApiDemos中拿來的:
fragment_slide_left_enter:
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<objectAnimator
android:interpolator="@android:interpolator/decelerate_quint"
android:valueFrom="100dp" android:valueTo="0dp"
android:valueType="floatType"
android:propertyName="translationX"
android:duration="@android:integer/config_mediumAnimTime" />
<objectAnimator
android:interpolator="@android:interpolator/decelerate_quint"
android:valueFrom="0.0" android:valueTo="1.0"
android:valueType="floatType"
android:propertyName="alpha"
android:duration="@android:integer/config_mediumAnimTime" />
</set>
fragment_slide_left_exit:
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<objectAnimator
android:interpolator="@android:interpolator/decelerate_quint"
android:valueFrom="0dp" android:valueTo="-100dp"
android:valueType="floatType"
android:propertyName="translationX"
android:duration="@android:integer/config_mediumAnimTime" />
<objectAnimator
android:interpolator="@android:interpolator/decelerate_quint"
android:valueFrom="1.0" android:valueTo="0.0"
android:valueType="floatType"
android:propertyName="alpha"
android:duration="@android:integer/config_mediumAnimTime" />
</set>
fragment_slide_right_enter:
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<objectAnimator
android:interpolator="@android:interpolator/decelerate_quint"
android:valueFrom="-100dp" android:valueTo="0dp"
android:valueType="floatType"
android:propertyName="translationX"
android:duration="@android:integer/config_mediumAnimTime" />
<objectAnimator
android:interpolator="@android:interpolator/decelerate_quint"
android:valueFrom="0.0" android:valueTo="1.0"
android:valueType="floatType"
android:propertyName="alpha"
android:duration="@android:integer/config_mediumAnimTime" />
</set>
fragment_slide_right_exit:
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<objectAnimator
android:interpolator="@android:interpolator/decelerate_quint"
android:valueFrom="0dp" android:valueTo="100dp"
android:valueType="floatType"
android:propertyName="translationX"
android:duration="@android:integer/config_mediumAnimTime" />
<objectAnimator
android:interpolator="@android:interpolator/decelerate_quint"
android:valueFrom="1.0" android:valueTo="0.0"
android:valueType="floatType"
android:propertyName="alpha"
android:duration="@android:integer/config_mediumAnimTime" />
</set>
android.support.v4.app.Fragment
Fragment:http://developer.android.com/reference/android/support/v4/app/Fragment.html
FragmentTransaction:http://developer.android.com/reference/android/support/v4/app/FragmentTransaction.html
使用v4包,Fragment的使用不再局限于API Level 11之上,低等級的API也可以使用,但是這時候轉場動畫的類型是View Animation。
動畫資源放在res\anim\路徑下,和Activity的轉場動畫一樣。
Fragment中的方法:onCreateAnimation(int transit, boolean enter, int nextAnim)傳回值Animation。
FragmentTransaction中的setCustomAnimations()方法,兩參數類型和四參數類型都可用。
是以一般還是用v4包的這個版本,一是相容性比較好,另外View Animation其實基本可以滿足轉場動畫的需要。
private void addFragment() {
if (null == mFragmentManager) {
mFragmentManager = getSupportFragmentManager();
}
mTextFragmentOne = new MyFragmentOne();
FragmentTransaction fragmentTransaction = mFragmentManager
.beginTransaction();
fragmentTransaction.setCustomAnimations(
R.anim.push_left_in,
R.anim.push_left_out,
R.anim.push_left_in,
R.anim.push_left_out);
fragmentTransaction.add(R.id.container, mTextFragmentOne);
fragmentTransaction.addToBackStack(null);
fragmentTransaction.commit();
}
Demo:
完整的例子項目:https://github.com/mengdd/HelloTransactionAnimations
作者: 聖騎士Wind
出處: 部落格園: 聖騎士Wind
Github: https://github.com/mengdd
微信公衆号: 聖騎士Wind
