Android中的活动转换
如何定义Android 1.5及更高版本的两个活动之间的转换? 我想要一个活动淡入。
你可以用Activity.overridePendingTransition()
来做到这一点。 您可以在XML资源文件中定义简单的过渡animation。 在这里可以find一个很好的教程。
这是两个活动之间做一个很好的平滑淡出的代码。
在res / anim中创build一个名为fadein.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="2000" />
在res / anim中创build一个名为fadeout.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="1.0" android:toAlpha="0.0" android:duration="2000" />
如果要从活动A淡入到活动B,请将以下内容放在活动B的onCreate方法中。在setContentView适用于我之前。
overridePendingTransition(R.anim.fadein, R.anim.fadeout);
如果淡入淡出,请将上述xml文件中的android:duration更改为更小的值。
是。 你可以告诉操作系统你想要进行什么样的转换。
@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); getWindow().setWindowAnimations(ANIMATION); ... }
其中ANIMATION是一个整数,指的是操作系统中内置的animation。
一个简单的方法是:
- 在您的styles.xml文件中创build一个animation样式
<style name="WindowAnimationTransition"> <item name="android:windowEnterAnimation">@android:anim/fade_in</item> <item name="android:windowExitAnimation">@android:anim/fade_out</item> </style>
- 将此样式添加到您的应用程序主题
<style name="AppBaseTheme" parent="Theme.Material.Light.DarkActionBar"> <item name="android:windowAnimationStyle">@style/WindowAnimationTransition</item> </style>
而已 :)
有关默认animation的列表,请参阅: http : //developer.android.com/reference/android/R.anim.html
实际上,对于API级别1和以上,实际上有fade_in
和fade_out
。
创buildres> anim> fadein.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="500" />
创buildres> anim> fadeout.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="1.0" android:toAlpha="0.0" android:duration="500" />
在res> values> styles.xml中
<style name="Fade"> <item name="android:windowEnterAnimation">@anim/fadein</item> <item name="android:windowExitAnimation">@anim/fadeout</item> </style>
在活动onCreate()
getWindow().getAttributes().windowAnimations = R.style.Fade;
以下是在两个活动之间进行良好平滑的代码。
-
平滑的效果从左到右
在res / anim中创build一个名为slide_in_right.xml和slide_out_right.xml的文件
slide_in_right.xml
<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android" android:shareInterpolator="false" > <translate android:duration="5000" android:fromXDelta="100%" android:toXDelta="0%" /> <alpha android:duration="5000" android:fromAlpha="0.0" android:toAlpha="1.0" /> </set>
slide_out_right.xml
<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android" android:shareInterpolator="false" > <translate android:duration="5000" android:fromXDelta="0%" android:toXDelta="-100%"/> <alpha android:duration="5000" android:fromAlpha="1.0" android:toAlpha="0.0" /> </set>
-
顺利的效果从右到左
在res / anim中创build一个名为animation_enter.xml和animation_leave.xml的文件
animation_enter.xml
<set xmlns:android="http://schemas.android.com/apk/res/android" android:shareInterpolator="false"> <translate android:fromXDelta="-100%" android:toXDelta="0%" android:fromYDelta="0%" android:toYDelta="0%" android:duration="700"/> </set>
animation_leave.xml
<set xmlns:android="http://schemas.android.com/apk/res/android" android:shareInterpolator="false"> <translate android:fromXDelta="0%" android:toXDelta="100%" android:fromYDelta="0%" android:toYDelta="0%" android:duration="700" /> </set>
-
从一个活动导航到第二个活动
Intent intent_next=new Intent(One_Activity.this,Second_Activity.class); overridePendingTransition(R.anim.slide_in_right,R.anim.slide_out_right); startActivity(intent_next); finish();
4.在后面按事件或从第二个活动导航到一个活动
Intent home_intent = new Intent(Second_Activity.this, One_Activity.class); overridePendingTransition(R.anim.animation_enter, R.anim.animation_leave); startActivity(home_intent); finish();
我覆盖了我的默认活动animation。 我在api 15中testing它工作顺利。 这是我使用的解决scheme:
<!-- Base application theme. --> <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar"> <!-- Customize your theme here. --> <item name="colorPrimary">@color/colorPrimary</item> <item name="colorPrimaryDark">@color/colorPrimaryDark</item> <item name="colorAccent">@color/colorPrimary</item> <item name="android:windowAnimationStyle">@style/CustomActivityAnimation</item> </style> <style name="CustomActivityAnimation" parent="@android:style/Animation.Activity"> <item name="android:activityOpenEnterAnimation">@anim/slide_in_right</item> <item name="android:activityOpenExitAnimation">@anim/slide_out_left</item> <item name="android:activityCloseEnterAnimation">@anim/slide_in_left</item> <item name="android:activityCloseExitAnimation">@anim/slide_out_right</item> </style>
创buildres文件夹下的anim文件夹,然后创build这四个animation文件:
slide_in_right.xml
<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android"> <translate android:fromXDelta="100%p" android:toXDelta="0" android:duration="@android:integer/config_mediumAnimTime"/> </set>
slide_out_left.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="@android:integer/config_mediumAnimTime"/> </set>
slide_in_left.xml
<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android"> <translate android:fromXDelta="-100%p" android:toXDelta="0" android:duration="@android:integer/config_mediumAnimTime"/> </set>
slide_out_right.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="@android:integer/config_mediumAnimTime"/> </set>
你可以下载我的示例项目 。
就这样… :)
Android 1.5中不能使用overridePendingTransition。 overridePendingTransistion来到Android 2.0。
如果你要经过这个没有任何错误,你必须使用普通animation(或你自己)编译目标(1.5或更高),或者你必须编译的目标(2.0或更高)使用overridePendingTransistion。
总结: 您不能在Android 1.5中使用overridePendingTransistion 。
您可以使用操作系统中的内置animation。
IN GALAXY设备:
您需要确保您没有使用“设置”>“开发人员选项”在设备中将其closures。
使用ActivityCompat.startActivity()工作API> 21。
ActivityOptionsCompat options = ActivityOptionsCompat.makeSceneTransitionAnimation(activity, transitionImage, EXTRA_IMAGE); ActivityCompat.startActivity(activity, intent, options.toBundle());
在开始您的意图之前:
ActivityOptions options = ActivityOptions.makeSceneTransitionAnimation(AlbumListActivity.this); startActivity(intent, options.toBundle());
这给你的活动转换默认animation。