【问题标题】:Activity transition in AndroidAndroid 中的活动转换
【发布时间】:2011-03-24 07:14:23
【问题描述】:

如何为 Android 1.5 及更高版本定义两个 Activity 之间的转换? 我想要一个活动淡入。

【问题讨论】:

  • 适用于以下所有与overridePendingTransition 相关的答案:如果您根本不需要动画,则可以传递(0, 0)

标签: android android-activity transition


【解决方案1】:

这是在两个活动之间进行平滑淡入淡出的代码..

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="2000" />

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="2000" />

如果您想从 Activity A 淡入到 Activity B,请将以下内容放入 Activity BonCreate() 方法中。在setContentView() 为我工作之前。

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

如果渐变对您来说太慢,请将上面 xml 文件中的 android:duration 更改为更小的值。

【讨论】:

  • 只是添加到这个。在操作系统决定关闭您的活动之后,需要再次调用 overridePendingTransition()。我只是在 Activity 的 onPause() 方法中对 overridePendingTransition(fadein,fadeout) 进行了另一个相同的调用。否则,您将看到 Activity 淡入,但在关闭时不会淡出。
  • 其他线程没有答案。我正在删除它。我所经历的是过渡立即发生,然后它变暗并淡入。所以我在活动 A 上显示活动 B,然后变暗并淡入。然后我修改它以按照说明进行操作将代码添加到 Activity A 的 onPause() 并获得相同的行为。
  • 使用内置的 Android 动画似乎可以实现更平滑的过渡:overridePendingTransition(android.R.anim.fadein, android.R.anim.fadeout); 查看这些文件还可以为您提供有关如何改进自定义动画的提示(例如,通过使淡入持续时间超过淡出)。
  • 别忘了把fadeinfadeout改成fade_infade_out。来自 Dan J 的帖子
  • 根据文档,您应该在调用finish() 和/或startActivity() 之后立即调用overridePendingTransition()。通过在启动新 Activity 后立即调用它,我能够以这种方式获得很好的渐变效果。
【解决方案2】:

您可以使用Activity.overridePendingTransition() 执行此操作。您可以在 XML 资源文件中定义简单的过渡动画。

【讨论】:

  • 感谢 iandisme。 overridePengingTransition 是 API 级别 5。对于级别 3(Android 1.5)不能这样做吗?
  • 啊,你是对的。 CaseyB 的回答可能更符合您的要求。
  • 尚未找到如何使用 CaseyB 的答案进行适当的淡入。
  • 您可以在 Activity 的 onCreate 函数中执行此操作。
  • 在 HTC 上,您必须更改设置 > 显示 > 动画才能正常工作(或至少在 HTC Desire HD 上)。
【解决方案3】:

一个更简单的方法是:

  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>

就是这样:)

【讨论】:

    【解决方案4】:

    是的。您可以告诉操作系统您希望对您的活动进行什么样的转换。

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

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

    【讨论】:

    • 我必须做其他事情才能让它工作吗? getWindow().setWindowAnimations(android.R.anim.fade_in) 不会导致默认使用的推送过渡,但它也不是淡入淡出过渡。在 Nexus One 设备中,新活动仅显示在之前的活动之上。
    • 那是因为这不是请求资源,而是请求操作系统内置的过渡动画的 id。 developer.android.com/intl/fr/reference/android/view/…
    • 看来 setWindowAnimations 只接受样式资源。 getWindow().setWindowAnimations(android.R.style.Animation_Toast) 是我发现的最接近淡入的,但它是从黑色淡入的,而不是之前的活动。
    • 在操作系统中不一定要内置动画,可以在values中自定义一个。
    • @ilija139,你确定吗?它在这里说developer.android.com/reference/android/view/…:“这必须是系统资源;它不能是应用程序资源,因为窗口管理器无权访问应用程序。”
    【解决方案5】:

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

    事实上,fade_infade_out 用于 API 级别 1 及更高级别。

    【讨论】:

    • 例如getWindow().setWindowAnimations(android.R.anim.slide_in_left);
    • 干杯,我花了很长时间谷歌搜索才找到这些。
    【解决方案6】:

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

    【讨论】:

    • 我建议将其添加到主题中以便应用于所有活动?
    • 这些动画在Android中已经定义好了,只需在所有activity的onPause()中添加如下代码即可:overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out);
    • 是的,只是想表明可以根据开发人员的喜好编辑动画。
    【解决方案7】:

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

    就是这样……:)

    【讨论】:

    • 这应该是公认的答案。效果很好!
    【解决方案8】:

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

    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 的 startActivity 之后。
    • overridePendingTransition 应该在 3 和 4 的 startActivity 之后
    • 如果 overridePendingTransition() 放在 startActivity() 之前,它对我不起作用
    • 应该在之后立即调用overridePendingTransition startActivity:developer.android.com/reference/android/app/…
    【解决方案9】:

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

    如果您要在没有任何错误的情况下完成此操作,则必须使用普通动画(或您拥有)为目标(1.5 或更高版本)编译,或者您必须使用 overridePendingTransistion 为目标(2.0 或更高版本)编译.

    总结:您不能在 Android 1.5 中使用 overridePendingTransistion

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

    【讨论】:

    • 这是不正确的。动画在 1.6 之前就已经在 Android 中了,您可以使用带有反射的 overridePendingTransistion 来仍然以 1.5 为目标。
    • 好吧,我的错。更新了我的帖子。您当然可以在 1.5 中制作自己的动画并根据需要自定义它们。但是你仍然不能使用 overridePendingTransition,因为它开始出现在 API 级别 5 中。
    【解决方案10】:

    在开始你的意图之前:

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

    这会为您的 Activity 过渡提供默认动画。

    【讨论】:

      【解决方案11】:

      在 GALAXY 设备中:

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

      【讨论】:

      • 即使是 LG 设备 :)
      • 我想是的,但我没有尝试过
      • 太棒了!经过几个小时搜索过渡和动画后,我找到了您的答案。
      【解决方案12】:

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

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

      【讨论】:

        【解决方案13】:

        放大动画

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

        缩放退出

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

        【讨论】:

        • "overridePendingTransition" 将在 startActivity() 方法之后调用
        【解决方案14】:

        有些版本的 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();
                       }
                    }
        

        这里以简单的淡入淡出动画为例进行过渡演示..

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-15
          • 2023-03-16
          • 2015-07-09
          • 1970-01-01
          • 1970-01-01
          • 2021-07-23
          相关资源
          最近更新 更多