为Activity添加切换动画


Activity跳转可以带有一些转场动画,从一个Activity切换到另一个Activity,本文将介绍一个比较简单的实现方式。从一个Activity切换到另一个,或者执行Fragment转换的时候。 定义两个anim文件作为第一个Activity退出,第二个Activity进入的动画文件。

push_left_in.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate
        android:duration="200"
        android:fromXDelta="100%p"
        android:toXDelta="0"/>
</set>

push_left_out.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate
        android:duration="200"
        android:fromXDelta="0"
        android:toXDelta="-100%p"/>
</set>

定义好文件后做动画的过程就很简单,我们只需要在startActivity调用之后添加我们的动画。

startActivity(new Intent(Intent.ACTION_VIEW, uri));
            overridePendingTransition(R.anim.push_left_in,R.anim.push_left_out);

如果是Fragment的startActivity我们则需要拿到所在的Activity再调用overridePendingTransition,Fragment并没有这个方法。

点击进入可以正常进行动画,但退出的时候并没有动画。退出的动画需要在第二个Activity的finish方法中添加。我们需要再定义第二个Activity的退出和第一个Activity的进入动画。

push_right_out.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate
        android:duration="200"
        android:fromXDelta="0"
        android:toXDelta="100%p"/>
</set>    

push_right_in.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate
        android:duration="200"
        android:fromXDelta="-100%p"
        android:toXDelta="0"/>
</set>     

finish中添加动画

@Override
public void finish() {
    super.finish();
    overridePendingTransition(R.anim.push_right_in, R.anim.push_right_out);
}

Fragment的页面转换动画与Activity略有不同,可以直接通过FragmentTransition指定使用默认的转换动画,也可以使用自定义的转换动画,但是要求一次指定四个动画,两个进入的动画,两个退出的动画, 使用默认的转换动画:

    getSupportFragmentManager()
            .beginTransaction()
            .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)
            .replace(R.id.content_layout, new ShowRateFragment()).commit();

使用自定义的转换动画

    getSupportFragmentManager()
            .beginTransaction()
            .setCustomAnimations(R.anim.push_left_in, R.anim.push_left_out, R.anim.push_right_in, R.anim.push_right_out)
            .replace(R.id.content_layout, new ShowRateFragment()).commit();


本作品由 Tony Zhang 创作,采用 CC BY-NC-SA 3.0 许可协议 进行许可。

Comments