196

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

4

14 回答 14

198

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

创建一个名为的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" />

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

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

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

于 2011-02-28T17:17:54.773 回答
167

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

于 2010-08-02T16:09:00.960 回答
52

一个更简单的方法是:

  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>

而已 :)

于 2014-11-28T01:25:08.093 回答
32

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

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

    ...

}

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

于 2010-08-02T16:10:39.470 回答
30

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

实际上fade_infade_out对于 API 级别 1 及更高级别,存在和。

于 2012-01-24T07:37:03.520 回答
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;
于 2012-05-14T01:09:25.500 回答
28

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

您可以下载我的示例项目

就这样... :)

于 2016-10-09T12:58:47.283 回答
26

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

  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 的文件

    动画输入.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>
    

    动画离开.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();
    
于 2015-07-31T07:21:51.897 回答
4

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

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

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

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

于 2010-08-02T16:50:52.943 回答
3

在开始你的意图之前:

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

这为您的活动转换提供了默认动画。

于 2017-09-06T15:39:07.327 回答
2

在 GALAXY 设备中:

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

两个木偶

于 2015-05-24T09:35:24.510 回答
1

放大动画

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

缩放输入

<?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" />
于 2018-05-30T07:14:42.870 回答
1

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

    ActivityOptionsCompat options = ActivityOptionsCompat.makeSceneTransitionAnimation(activity, transitionImage, EXTRA_IMAGE);
    ActivityCompat.startActivity(activity, intent, options.toBundle());
于 2015-11-25T18:46:50.223 回答
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();
               }
            }

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

于 2018-05-20T11:55:39.220 回答