首先说明以下,activity切换动画有两种方式,开发人员可以根据自己的需要自己选择。
一、在startactivity之后调用overridePendingTransition(int enterAnim, int outAnim)这个方法。
在Android2.0之后,当程序在Activity之间进行切换时,可以添加切换动画的。其实添加Activity切换动画只是很简单的调用一个api函数:overridePendingTransition(int enterAnim, int outAnim),两个参数分别指向两个定义动画的xml文件资源,下面先用一段简单的代码说明该函数的使用方法。
假设有两个Activity,分别为A和B。
当在A中启动B时,可以使用如下方式添加动画:
首先在xml中定义两个动画,放在R.anim文件夹目录下:
right_left_out.xml:
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" >
<translate
android:duration="400"
android:fromXDelta="0"
android:fromYDelta="0"
android:interpolator="@android:anim/decelerate_interpolator"
android:toXDelta="-100%p"
android:toYDelta="0" />
</set>
right_left_in.xml:
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" >
<translate
android:duration="400"
android:fromXDelta="100%p"
android:fromYDelta="0"
android:interpolator="@android:anim/decelerate_interpolator"
android:toXDelta="0"
android:toYDelta="0" />
</set>
然后在A中启动B时,就可以利用这两个动画定义文件让A和B的切换过程产生动画下过,如下代码片段演示:
Intent intent = new Intent(A.this, B.class);
A.this.startActivity(intent);
//参数一是下一个Activity的进入动画,参数二是当前Activity的退出动画
overridePendingTransition(R.anim.right_left_in, R.anim.right_left_out);
在B中返回A时,可以使用如下动画:
left_right_out.xml:
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" >
<translate
android:duration="400"
android:fromXDelta="0"
android:fromYDelta="0"
android:interpolator="@android:anim/decelerate_interpolator"
android:toXDelta="100%p"
android:toYDelta="0" />
</set>
left_right_in.xml:
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" >
<translate
android:duration="400"
android:fromXDelta="-100%p"
android:fromYDelta="0"
android:interpolator="@android:anim/decelerate_interpolator"
android:toXDelta="0"
android:toYDelta="0" />
</set>
代码片段:
B.this.finish();
overridePendingTransition(R.anim.left_right_in, R.anim.left_right.out);
如果希望在用户按返回键是从B退回到A时也能够有动画效果,则需要在B中截取按钮事件,并手动结束当前Activity。代码片段如下:
@Override
public boolean onKeyUp(int keyCode, KeyEvent event)
{
if (keyCode == KeyEvent.KEYCODE_BACK)
{
B.this.finish();
overridePendingTransition(R.anim.left_right_in, R.anim.left_right_out);
return true;
}
return super.onKeyUp(keyCode, event);
}
这个方法比较简单吧,只用调用一个api就行了。但是如果activity比较多,可以让所有的activity都继承一个baseactivity,然后继承baseactivity里面的startactivity和finish方法,切换动画效果都在baseactivity里面完成就行了,这也是比较简单的,代码就不列了。
二、使用theme主题来设置切换动画
我们知道,在Manifest文件中声明Activity时,可以通过android:theme属性设置Activity的主题。主题中定义了关于Activity外观的很多特性。同时,主题中还可以定义Activity的切换动画。通过主题的形式定义的Activity切换动画,甚至可以超越API的限制,在2.0以下的系统版本中依然能够设置Activity切换动画。
下面就一个简单的例子说明怎么定义包含Activity切换动画的主题。
首先,我们先看一下包含动画的主题是怎么定义的。在R.values文件夹中新建一个style.xml的文件,在其中插入一个<style />节点,声明一个主题,代码如下:
R.values.style:
<style name="Activity.Theme" parent="@android:style/Theme.NoTitleBar">
<item name="android:windowAnimationStyle">@style/anim_activity</item>
</style>
可以看到,以上主题的父主题是@android:style/Theme.NoTitleBar, 就是继承自系统主题的大部分属性。
其中有一个"android:windowAnimationStyle"属性是由我们自定义的,定位的位置同样在R.values.style文件中。代码如下:
<style name="anim_activity" mce_bogus="1" parent="@android:style/Animation.Activity">
<item name="android:activityOpenEnterAnimation">@anim/activity_open_in_anim</item>
<item name="android:activityOpenExitAnimation">@anim/activity_open_out_anim</item>
<item name="android:activityCloseEnterAnimation">@anim/activity_close_in_anim</item>
<item name="android:activityCloseExitAnimation">@anim/activity_close_out_anim</item>
</style>
现在假设有两个Activity, A 和 B。 在A中可以启动B. 同时,A,B的theme属性均设置为上面定义的属性。那么,以上动画的发生时机如下:
(1)当A启动B时,A退出,B进入,A退出时的动画名称为android:activityOpenExitAnimation,动画文件为
R.anim.activity_open_out_anim. B进入时的动画名称为android:activityOpenEnterAnimation, 动画文件为R.anim.activity_open_in_anim.
(2)当B结束时,B退出,A进入。B退出的动画名称为android:activityCloseExitAnimation, 动画文件为R.anim.activity_close_out_anim. A进入时的动画名称为android:activityCloseEnterAnimation, 动画文件为R.anim.activity_close_in_anim.
通过以上设置,Activity切换时便可以显示切换动画效果。
下面四个文件定位的是上面用到的四个动画。
R.anim.activity_close_in_anim.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" >
<translate
android:duration="400"
android:fromXDelta="-100%p"
android:fromYDelta="0"
android:interpolator="@android:anim/decelerate_interpolator"
android:toXDelta="0"
android:toYDelta="0" />
</set>
R.anim.activity_close_out_anim.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" >
<translate
android:duration="400"
android:fromXDelta="0"
android:fromYDelta="0"
android:interpolator="@android:anim/decelerate_interpolator"
android:toXDelta="100%p"
android:toYDelta="0" />
</set>
R.anim.activity_open_in_anim.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" >
<translate
android:duration="400"
android:fromXDelta="100%p"
android:fromYDelta="0"
android:interpolator="@android:anim/decelerate_interpolator"
android:toXDelta="0"
android:toYDelta="0" />
</set>
R.anim.activity_open_out_anim.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" >
<translate
android:duration="400"
android:fromXDelta="0"
android:fromYDelta="0"
android:interpolator="@android:anim/decelerate_interpolator"
android:toXDelta="-100%p"
android:toYDelta="0" />
</set>
补充一下,xml中设置的资料:
从上图可以看出,以手机屏幕下面边未X轴,屏幕左边为Y轴,当Activity在X轴值为-100%p时,刚好在屏幕的左边(位置1),当X轴值为0%p时,刚好再屏幕内(位置2),当X=100%p时刚好在屏幕右边(位置3)。
清楚了位置后,我们就可以实现左右滑动滑动的切换效果,首先让要退出的Activity从位置2移动到位置1,同时让进入的Activity从位置3移动位置2,这样就能实现从左右切换效果。