Android中的活动过渡


188

如何为Android 1.5及更高版本定义两个活动之间的过渡?我希望一项活动淡出。


7
适用于以下所有overridePendingTransition相关的答案:(0, 0)如果您完全不希望动画,则可以通过。
dokkaebi

Answers:


164

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


感谢iandisme。overlayPengingTransition是API级别5。在级别3(Android 1.5)上是否无法执行此操作?
hpique 2010年

啊,你是对的。CaseyB的答案可能更符合您的需求。
iandisme

尚未发现如何使用CaseyB的答案进行适当的淡入。
hpique 2010年

1
您可以在“活动” onCreate功能中执行此操作。
mxcl

1
在HTC上,您必须将设置>显示>动画全部更改(或至少在HTC Desire HD上)。
Urboss

191

这是在两个Activity之间进行平滑淡入的代码。

创建一个名为文件fadein.xmlres/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.xmlres/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,请将以下内容放入活动BonCreate()方法中。之前对我有用。setContentView()

overridePendingTransition(R.anim.fadein, R.anim.fadeout);

如果淡入淡出对您来说太慢,请android:duration在上面的xml文件中将其更改为较小的值。


53
只是添加到此。在操作系统决定关闭您的Activity之后,需要再次调用overridePendingTransition()。我只是在Activity的onPause()方法中再次调用了overridePendingTransition(fadein,fadeout)。否则,您会看到“活动”逐渐淡入,但关闭后不会淡出。
Nate

2
在其他线程上没有答案。我要删除它。我正在经历的是过渡立即发生,然后变暗并逐渐消失。所以我在“活动A”上,显示活动B,然后变暗并逐渐消失。然后我按照以下说明对其进行了修改将代码添加到活动A的onPause()并获得相同的行为。
Geeks On Hugs,2012年

12
使用内置的Android动画似乎可以使过渡更为平滑:overridePendingTransition(android.R.anim.fadein, android.R.anim.fadeout); 查看这些文件还可以提示您如何改进自定义动画(例如,使上一次淡入的时间长于淡出的时间)。
Dan J

3
只是不要忘了改fadein,并fadeoutfade_infade_out。来自Dan J的帖子
Farid

1
根据文档,您应该overridePendingTransition()在致电finish()和/或之后立即致电startActivity()。通过在启动新的Activity之后立即调用它,我能够以这种方式很好地淡入淡出。
Ionoclast Brigham

50

一个简单的方法是:

  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

是。您可以告诉OS您想要进行哪种过渡。

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

    ...

}

其中ANIMATION是整数,是指OS中的内置动画。


我是否需要做其他事情才能使其正常工作?getWindow()。setWindowAnimations(android.R.anim.fade_in)不会导致默认使用的推入过渡,但也不是淡入过渡。新活动仅出现在Nexus One设备中的上一个活动上。
hpique 2010年

1
那是因为这不是在要求资源,而是在要求操作系统中内置的过渡动画的ID。 developer.android.com/intl/fr/reference/android/view/…–
CaseyB

4
似乎setWindowAnimations仅接受样式资源。getWindow()。setWindowAnimations(android.R.style.Animation_Toast)是我找到的最接近淡入淡出的颜色,但它从黑色淡入淡出,而不是先前的活动。
hpique 2010年

1
它不一定要在OS中以动画形式构建,您可以在值中定义一个自定义值。
ilija139 2011年

1
@ ilija139,您确定吗?它在此处说developer.android.com/reference/android/view/…:“这必须是系统资源;它不能是应用程序资源,因为窗口管理器无法访问应用程序。”
青金石

29

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

创建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;

2
我建议将其添加到主题,以便将其应用于所有活动?
Peterdk 2012年

12
这些动画已经在Android中定义,只需在所有活动的onPause()中添加以下代码即可:overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out);
Elad Nava 2012年

是的,只是想表明动画可以根据开发人员的喜好进行编辑。
IceSteve 2012年


25

我覆盖了默认的活动动画。我在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>

您可以下载我的示例项目

就这样... :)


这应该是接受的答案。效果很好!
EdgeDev

24

这是在两个活动之间进行平滑处理的代码。

  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();


OverridePendingTransition应该在3和4中的startActivity之后
Tareq

如果将overridePendingTransition()放在startActivity()之前,这对我不起作用
费尔南多·坦

应该调用overridePendingTransition立即 startActivity:developer.android.com/reference/android/app/...
Midhun MP

4

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

如果您要顺利进行此操作,则必须使用普通动画(或您拥有的)为目标(1.5或更高版本)编译,或者必须使用overridePendingTransistion为目标(2.0或更高版本)编译。

摘要:您不能在Android 1.5中使用overridePendingTransistion

不过,您可以在OS中使用内置动画。


那是不对的。动画早在Android 1.6之前就已经存在,您可以将带有反射的overridePendingTransistion仍以1.5为目标。
hpique 2010年

好吧,我的错误。更新了我的帖子。您肯定可以在1.5中制作自己的动画并自定义它们。但是您仍然不能使用overridePendingTransition,因为它开始出现在API级别5
Curtain


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" />
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.