Activity的转场动画是经过overridePendingTransition(int enterAnim, int exitAnim)实现的。html
这个方法是API Level 5 加入的。android
这个方法在startActivity(Intent)
or finish()
以后被调用,指定接下来的这个转场动画。git
方法的第一个参数:enterAnim,是新的Activity的进入动画的resource ID;github
第二个参数exitAnim,是旧的Activity(当前的Activity)离开动画的resource ID。app
因此这两个参数的对象是两个Activity。 ide
若是上面两个参数没有动画要设置,则用0做为参数。学习
动画的资源文件放在res\anim\目录下,是View Animation。动画
参见本博客博文:Android Animation学习(六) View Animation介绍ui
View Animation包含了基本的动画类型,基本能够知足通常转场动画的须要。this
根节点能够是:<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的转场动画实现分为使用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调用以前被设置,不然不起做用。
类参考:
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>
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(); }
完整的例子项目:https://github.com/mengdd/HelloTransactionAnimations