通过调用overridePendingTransition() 可以实时修改Activity的切换动画。但需注意的是:该函数必须在调用startActivity()或者finish()后立即调用,且只有效一次。
为打开Activity动作添加动画效果
1. 代码整理自 Android-8 例子程序 : ApiDemos
2. 实现的方式是调用 Activity 的 overridePendingTransition 方法,这个方法的签名为:
overridePendingTransition(int enterAnim, int exitAnim)
文档对两个参数的解释为:
@param enterAnim : enterAnim A resource ID of the animation resource to use for the incoming activity. Use 0 for no animation.
@param exitAnim : exitAnim A resource ID of the animation resource to use for the outgoing activity. Use 0 for no animation.
这个方法的作用就是在从一个 Activity 在切换到另一个 Activity 的间歇期间,闪电式放两个画面。
第一个参数就是第一个画面,第二个参数是第二个画面。
而,这个画面的效果是以 XML 来定义的,两个参数都是 R 文件中指向两个定义了动画效果的 XML 文件。
2. 下面示例两种动画效果,用于从一个 Activity 切换到另一个 Activity 的动画效果。
一种是淡出式。
一种是 zoom ,是一种页面急速向上卷起的效果。
** 界面布局很简单。在首页上两个按钮,点击后分别以两种效果打开另外一个 Activity
main.xml:
- <?xml version="1.0" encoding="utf-8"?>
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:orientation="vertical"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- >
- <Button android:id="@+id/fadeButton"
- android:layout_width="wrap_content" android:layout_height="wrap_content"
- android:text="淡出方式打开-Fade">
- </Button>
- <Button android:id="@+id/zoomButton"
- android:layout_width="wrap_content" android:layout_height="wrap_content"
- android:text="上升式打开-Zoom">
- </Button>
- </LinearLayout>
** 打开后的新的 Activity 显示 "您好"
other.xml:
- <?xml version="1.0" encoding="utf-8"?>
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:orientation="vertical"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- >
- <TextView
- android:text="你好"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"/>
- </LinearLayout>
** AndroidManifest.xml 要注册新的那个 Activity
- <?xml version="1.0" encoding="utf-8"?>
- <manifest xmlns:android="http://schemas.android.com/apk/res/android"
- package="wjh.android"
- android:versionCode="1"
- android:versionName="1.0">
- <application android:icon="@drawable/icon" android:label="@string/app_name">
- <activity android:name=".Mainactivity"
- android:label="@string/app_name">
- <intent-filter>
- <action android:name="android.intent.action.MAIN" />
- <category android:name="android.intent.category.LAUNCHER" />
- </intent-filter>
- </activity>
- <activity android:name=".OtherActivity" />
- </application>
- <uses-sdk android:minSdkVersion="8" />
- </manifest>
** 切换代码:MainActivity
- /**
- * 为打开Activity添加动画效果
- */
- public class Mainactivity extends Activity {
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- /* 淡出式打开按钮 */
- Button button = (Button)findViewById(R.id.fadeButton);
- button.setOnClickListener(mFadeListener);
- /* 上升式打开按钮 */
- button = (Button)findViewById(R.id.zoomButton);
- button.setOnClickListener(mZoomListener);
- }
-
- /**
- * 按钮点击:处理淡出式打开新的 Activity
- */
- private OnClickListener mFadeListener = new OnClickListener() {
- public void onClick(View v) {
- startActivity(new Intent(Mainactivity.this, OtherActivity.class));
- overridePendingTransition(R.anim.fade, R.anim.hold);
- }
- };
- /**
- * 按钮点击:处理上升式打开新的 Activity
- */
- private OnClickListener mZoomListener = new OnClickListener() {
- public void onClick(View v) {
- startActivity(new Intent(Mainactivity.this, OtherActivity.class));
- overridePendingTransition(R.anim.zoom_enter, R.anim.zoom_exit);
- }
- };
- }
** 动画文件 -- 在res下新建一个文件夹用于存放定义动画,我建了一个anim文件夹
fade.xml
<?xml version="1.0" encoding="utf-8"?>
<alpha xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@android:anim/accelerate_interpolator"
android:fromAlpha="0.0" android:toAlpha="1.0"
android:duration="@android:integer/config_longAnimTime" />
hold.xml
<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@android:anim/accelerate_interpolator"
android:fromXDelta="0" android:toXDelta="0"
android:duration="@android:integer/config_longAnimTime" />
3. 其它效果:
只要拷贝以下效果到 XmL 文件再更改 overridePendingTransition 中的参数就可以了
** 左右滑入式
* push_left_out.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate android:fromXDelta="0" android:toXDelta="-100%p" android:duration="300"/>
<alpha android:fromAlpha="1.0" android:toAlpha="0.0" android:duration="300" />
</set>
* push_left_in.xml
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate android:fromXDelta="100%p" android:toXDelta="0" android:duration="300"/>
<alpha android:fromAlpha="0.0" android:toAlpha="1.0" android:duration="300" />
</set>
** 上下滑入式
* push_up_in.xml
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate android:fromYDelta="100%p" android:toYDelta="0" android:duration="300"/>
<alpha android:fromAlpha="0.0" android:toAlpha="1.0" android:duration="300" />
</set>
* push_up_out.xml
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate android:fromYDelta="0" android:toYDelta="-100%p" android:duration="300"/>
<alpha android:fromAlpha="1.0" android:toAlpha="0.0" android:duration="300" />
</set>
** 浮云式
* hyperspace_in.xml
<alpha xmlns:android="http://schemas.android.com/apk/res/android"
android:fromAlpha="0.0" android:toAlpha="1.0" android:duration="300" android:startOffset="1200" />
* hyperspace_out.xml
- <set xmlns:android="http://schemas.android.com/apk/res/android" android:shareInterpolator="false">
- <scale
- android:interpolator="@android:anim/accelerate_decelerate_interpolator"
- android:fromXScale="1.0"
- android:toXScale="1.4"
- android:fromYScale="1.0"
- android:toYScale="0.6"
- android:pivotX="50%"
- android:pivotY="50%"
- android:fillAfter="false"
- android:duration="700" />
- <set
- android:interpolator="@android:anim/accelerate_interpolator"
- android:startOffset="700">
-
- <scale
- android:fromXScale="1.4"
- android:toXScale="0.0"
- android:fromYScale="0.6"
- android:toYScale="0.0"
- android:pivotX="50%"
- android:pivotY="50%"
- android:duration="400" />
-
- <rotate
- android:fromDegrees="0"
- android:toDegrees="-45"
- android:toYScale="0.0"
- android:pivotX="50%"
- android:pivotY="50%"
- android:duration="400" />
- </set>
- </set>
另外还可以使用自定义主题的方式使用Activity开启的动态效果
比如:
向左滑动效果打开
在AndroidManifest.xml中定义Activity时使用:
android:theme="@style/Theme"
style.xml中定义:
<style name="Theme" parent="android:Theme.Wallpaper">
<item name="android:windowNoTitle">true</item>
</style>