Android中的活动转换

问题描述 投票:179回答:14

如何定义Android 1.5及更高版本的两个活动之间的转换?我希望活动能够淡出。

android android-activity transition
14个回答
163
投票

你可以用Activity.overridePendingTransition()做到这一点。您可以在XML资源文件中定义简单的过渡动画。


2
投票

在GALAXY设备:

您需要确保未使用“设置”>“开发者选项”在设备中将其关闭:


1
投票

使用ActivityCompat.startActivity()工作API> 21。

    ActivityOptionsCompat options = ActivityOptionsCompat.makeSceneTransitionAnimation(activity, transitionImage, EXTRA_IMAGE);
    ActivityCompat.startActivity(activity, intent, options.toBundle());

1
投票

在开始你的意图之前:

ActivityOptions options = ActivityOptions.makeSceneTransitionAnimation(AlbumListActivity.this);
startActivity(intent, options.toBundle());

这为您的活动过渡提供了默认动画。


0
投票

某些版本的Android支持自定义Activity过渡,而有些版本则不支持(较旧的设备)。如果你想使用自定义过渡,最好检查Activity是否有overridePendingTransition()方法,就像旧版本没有。

要知道该方法是否存在,可以使用反射API。这是一个简单的代码,它将检查并返回方法(如果存在):

Method mOverridePendingTransition;

try {
        mOverridePendingTransition = Activity.class.getMethod(
                "overridePendingTransition", new Class[] { Integer.TYPE, Integer.TYPE } );
        /* success */
    } catch (NoSuchMethodException nsme) {
        /* failure, this version of Android doesn't have this method */
    } 

然后,我们可以应用我们自己的转换,即如果它存在则使用此方法:

if (UIConstants.mOverridePendingTransition != null) {
               try {
                   UIConstants.mOverridePendingTransition.invoke(MainActivity.this, R.anim.activity_fade_in, R.anim.activity_fade_out);
               } catch (InvocationTargetException e) {
                   e.printStackTrace();
               } catch (IllegalAccessException e) {
                   e.printStackTrace();
               }
            }

在这里,作为一个例子,简单的淡入和淡出动画被用于过渡演示。


0
投票

放大动画

Intent i = new Intent(getApplicationContext(), LoginActivity.class);
 overridePendingTransition(R.anim.zoom_enter, R.anim.zoom_exit);
startActivity(i);
finish();

zoom_enter

<?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" />

zoom_exit

<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:fillAfter="true"
    android:duration="500" />

184
投票

这是在两个活动之间做一个漂亮的平滑淡入淡出的代码。

fadein.xml中创建一个名为res/anim的文件

<?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" />

fadeout.xml中创建一个名为res/anim的文件

<?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更改为更小的值。


42
投票

一个更简单的方法是:

  1. 在styles.xml文件中创建动画样式
<style name="WindowAnimationTransition">
    <item name="android:windowEnterAnimation">@android:anim/fade_in</item>
    <item name="android:windowExitAnimation">@android:anim/fade_out</item>
</style>
  1. 将此样式添加到您的应用主题
<style name="AppBaseTheme" parent="Theme.Material.Light.DarkActionBar">
      <item name="android:windowAnimationStyle">@style/WindowAnimationTransition</item>
</style>

而已 :)


31
投票

是。您可以告诉操作系统您希望为您的活动进行哪种转换。

@Override
public void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    getWindow().setWindowAnimations(ANIMATION);

    ...

}

ANIMATION是指操作系统中内置动画的整数。


29
投票

有关默认动画的列表,请参阅:http://developer.android.com/reference/android/R.anim.html

实际上fade_infade_out用于API级别1及以上。


28
投票

创建>动漫> 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" />

create res> 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;

23
投票

这是在两个活动之间做得很顺利的代码。

  1. 从左到右的平滑效果 在res / anim中创建一个名为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>
  2. 从右到左的平滑效果 在res / anim中创建一个名为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>
  3. 从一个活动导航到第二个活动 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();

22
投票

我覆盖了我的默认活动动画。我在api 15中测试它运行顺畅。这是我使用的解决方案:

<!-- 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>

在res文件夹下创建anim文件夹,然后创建这四个动画文件:

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>

你可以下载我的sample project

就这样... :)


4
投票

您不能在Android 1.5中使用overridePendingTransition。 overridePendingTransistion来到Android 2.0。

如果你要经历这个没有任何错误,你必须使用普通的动画(或你自己的)编译目标(1.5或更高),或者你必须使用overridePendingTransistion编译目标(2.0或更高)。

简介:您不能在Android 1.5中使用overridePendingTransition。

但您可以在操作系统中使用内置动画。

© www.soinside.com 2019 - 2024. All rights reserved.