Activity转场动画可以通过overridePendingTransition(int enterAnim, int exitAnim)来实现。这个方法是API 5加入的,方法的第一个参数:enterAnim,是跳转Activity的进入动画的resource ID;第二个参数exitAnim,是当前Activity的离开动画的resource ID。
动画的资源文件放在res\anim\目录下,是View Animation。View Animation包含了基本的动画类型,基本可以满足一般转场动画的需要。
若不调用该方法,会使用系统默认的跳转动画,而不是不使用动画(参数传0,才表示不使用动画)。需要特别注意的是该方法的调用时机:必须在startActivity或finish、onBackpress之后调用才有效。
代码例子:
activity_right_in.xml
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:duration="200"
android:fromXDelta="100%p"
android:toXDelta="0"/>
</set>
activity_right_out.xml
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:duration="200"
android:fromXDelta="0"
android:toXDelta="-100%p"/>
</set>
activity_left_in.xml
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:duration="200"
android:fromXDelta="-100%p"
android:toXDelta="0"/>
</set>
activity_left_out.xml
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:duration="200"
android:fromXDelta="0"
android:toXDelta="100%p"/>
</set>
在MainActivity中跳转
Intent intent = new Intent(MainActivity.this,SecondActivity.class);
startActivity(intent);
// transaction animation
overridePendingTransition(R.anim.activity_right_in,R.anim.activity_right_out);
在SecondActivity中回到MainActivity
finish();
// transaction animation
overridePendingTransition(R.anim.activity_left_in,R.anim.activity_left_out);
这样就实现了从右边进入,从左边退出的Activity转场动画。如果需要实现按返回键也有转场动画,需要重写Activity的onBackPress()方法。
@Override
public void onBackPressed() {
super.onBackPressed();
overridePendingTransition(R.anim.left_in,R.anim.left_out);
}
Fragment转场动画可以通过transaction.setTransition和setCustomAnimations来实现。系统已经定义好的动画效果,比如
transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE)是系统的淡入淡出动画,在add/hide/replace/remove之前调用即可。
FragmentTransaction transaction = manager.beginTransaction(); transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
fragment = MyFragment.newInstance();
transaction.add(R.id.container, fragment, fragment.getId() + "");
transaction.commit();
如果系统自带的动画效果满足不了你的需求,可以通过setCustomAnimations这个方法来实现。Activity的 overridePendingTransition一样,传入开启的Fragment进入动画resource ID和当前的Fragment关闭动画resource ID。
FragmentTransaction transaction = manager.beginTransaction();
transaction.setCustomAnimations(R.anim.right_in, R.anim.right_out);
fragment = MyFragment.newInstance();
transaction.add(R.id.container, fragment, fragment.getId() + "");
transaction.commit();