在开发android应用中,要把界面做的很炫的话肯定少不了动画。默认情况下两个Activity之间切换时就执行了动画,如果你对系统自动的一些动画效果不太满意的话,可以而自定义。Activity切换时需要同时执行两套动画,一个是前一个Activity消失的动画,一个是后一个Activity呈现的动画。
android中实现Activity切换动画有两种方式:
第一种,在Activity中提供了方法overridePendingTransition(int,int)可以实现切换动画,该方法的两个参数分别对应前后两个动画的资源文件。调用overridePendingTransition(int,int)时必须放在startActivity()之后,finish()之前。如果你按back键或只finish(),此方法不起作用。
动画资源文件需要放在res/anim/目录下,下面是分别是test_activity_enter.xml和test_activity_exit.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:shareInterpolator="true"
android:interpolator="@android:anim/linear_interpolator"
android:duration="@android:integer/config_longAnimTime" >
<alpha android:fromAlpha="0" android:toAlpha="1" />
<scale android:fromXScale="0" android:toXScale="1"
android:fromYScale="0" android:toYScale="1" />
<translate android:fromXDelta="-100%"
android:toXDelta="0%" />
<rotate android:fromDegrees="0" android:toDegrees="360" />
</set>
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:shareInterpolator="true"
android:duration="@android:integer/config_longAnimTime"
android:interpolator="@android:anim/linear_interpolator" >
<alpha android:fromAlpha="1.0" android:toAlpha="0" />
<translate android:fromXDelta="0%" android:toXDelta="100%" />
<scale android:fromXScale="1" android:toXScale="0"
android:fromYScale="1" android:toYScale="0" />
<rotate android:fromDegrees="0" android:toDegrees="-360" />
</set>
在Activity里面切换时,调用
Intent intent = new Intent(this,OtherActivity.class);
startActivity(intent);
overridePendingTransition(R.anim.test_activity_enter, R.anim.test_activity_exit);
<!-- Standard animations for a full-screen window or activity. -->最上面四个<item />对应的就是Activity切换时系统调用的动画style了,前两个对应和第一种一样的,后两种是按back键或finish Activity时执行的动画。 如果想办法替换成自己写的样式,就可以实现自定义了,先要定义四套动画,放在res/anim/目录下,这里还是沿用第一种方式的动画文件,为了简单前两种和后两种使用相同动画,然后要在res/values/目录下自定义style(theme),test_style.xml文件如下:
<style name="Animation.Activity">
<item name="activityOpenEnterAnimation">@anim/activity_open_enter</item>
<item name="activityOpenExitAnimation">@anim/activity_open_exit</item>
<item name="activityCloseEnterAnimation">@anim/activity_close_enter</item>
<item name="activityCloseExitAnimation">@anim/activity_close_exit</item>
<item name="taskOpenEnterAnimation">@anim/task_open_enter</item>
<span style="white-space:pre"> </span>…… ……
</style>
<resources xmlns:android="http://schemas.android.com/apk/res/android"><item />里的name必须要跟系统自带的给出的一模一样,非则编译不能通过。最后就在AndroidManifest.xml清单文件<application>标签里应用上面的样式:
<style name="TestThemeActivity" mce_bogus="1">
<item name="android:windowAnimationStyle">@style/TestAnimationActivity</item>
<item name="android:windowNoTitle">true</item>
</style>
<style name="TestAnimationActivity" parent="@android:style/Animation.Activity" mce_bogus="1">
<item name="android:activityOpenEnterAnimation">@anim/test_activity_enter</item>
<item name="android:activityOpenExitAnimation">@anim/test_activity_exit</item>
<item name="android:activityCloseEnterAnimation">@anim/test_activity_enter</item>
<item name="android:activityCloseExitAnimation">@anim/test_activity_exit</item>
</style>
</resources>
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="AnimatorTest"
android:theme="@style/TestThemeActivity"
>
上面设置的是theme属性,在application标签下按CTRL+/也看不到style, 关于style和theme区别,对比themes.xml,感觉好像差不多。
当第一种方式和第二种方式同时存在时,优先使用第一个。如果你想要某一个Activity有不同的动画效果,就可以使用第一种,即使第二种存在,也会优先使用第一个。