Android中的活动转换

Android中的活动转换,android,android-activity,transition,Android,Android Activity,Transition,我如何定义Android 1.5及更高版本的两个活动之间的转换? 我想要一个淡入淡出的活动。您可以使用。您可以在XML资源文件中定义简单的转换动画。是。您可以告诉操作系统您希望为您的活动进行何种转换 @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); getWindow().setWindowAnimations(ANIMATION);

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

您可以使用。您可以在XML资源文件中定义简单的转换动画。

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

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

    ...

}

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

在Android 1.5中不能使用overridePendingTransition。Android 2.0出现了overridePendingTransistion

如果要顺利完成此过程,您必须使用普通动画(或您自己的动画)为目标(1.5或更高版本)编译,或者使用overridePendingTransistion为目标(2.0或更高版本)编译

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


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

以下是在两个活动之间进行平滑淡入的代码

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

有关默认动画的列表,请参阅:


事实上,对于API级别1及更高的API,存在
fade\u in
fade\u out

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

更简单的方法是:

  • 在styles.xml文件中创建动画样式
  • 
    @安卓:动画/淡入
    @安卓:动画/淡出
    
  • 将此样式添加到应用程序主题
  • 
    @样式/窗口动画转换
    
    就是这样:)

    在GALAXY设备中:

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


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

    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        getWindow().setWindowAnimations(ANIMATION);
    
        ...
    
    }
    
  • 从左到右平滑效果

    在res/anim中创建一个名为slide_in_right.xml和slide_out_right.xml的文件

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

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

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

    我覆盖默认的活动动画。我在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文件夹下创建动画文件夹,然后创建以下四个动画文件:

    将\u滑入\u 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>
    
    <?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>
    
    <?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>
    
    
    
    滑出\u 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>
    
    
    
    在\u left.xml中滑动\u

    <?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>
    
    
    
    滑出\u 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>
    
    <?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>
    
    <?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>
    
    
    
    你可以下载我的


    就这些……:)

    开始您的意图之前:

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

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

    有些版本的Android支持自定义
    活动
    转换,有些则不支持(较旧的设备)。如果要使用自定义转换,最好检查
    活动
    是否具有
    重写PendingTransition()
    方法,而在旧版本中没有

    要知道该方法是否存在,可以使用反射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();
                   }
                }
    
    这里,作为一个例子,简单的淡入淡出动画用于过渡演示。

    缩放动画

    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" />
    
    
    
    谢谢你的邀请。OverrideEngingTransition是API级别5。三级(安卓1.5)不可能做到这一点吗?啊,你说得对。CaseyB的答案可能更符合您的要求。尚未找到如何使用CaseyB的答案进行适当的淡入。您可以在活动的
    onCreate
    功能中进行此操作。在HTC上,您必须将“设置>显示>动画”更改为“全部”(或至少在HTC Desire HD上).我必须做些别的事情才能让它工作吗?getWindow().setWindowAnimations(android.R.anim.fade_in)不会导致默认情况下使用的推送转换,但也不是淡入转换。在Nexus one设备中,新的活动只是出现在前一个活动的基础上。这是因为它不需要资源,而是需要操作系统内置的过渡动画的id。setWindowAnimations似乎只接受样式资源。getWindow().setWindowAnimations(android.R.style.Animation_Toast)是我发现的最接近淡入的,但它会从黑色淡入,而不是以前的活动。它不必在操作系统中内置动画,您可以在值中定义自定义动画。@ilija139,确定吗?它在这里说:“这必须是一个系统资源;它不能是一个应用程序资源,因为窗口管理器没有访问应用程序的权限。”这是不正确的。早在1.6版本之前,Android就已经有了动画,你可以使用带有反射的overridePendingTransistion来仍然以1.5版本为目标。更新了我的帖子。您当然可以在1.5中制作自己的动画并自定义它们。但您仍然不能使用overridePendingTransition,因为它开始出现在API级别5中。只需添加到这一点。在操作系统决定关闭活动之后,需要再次调用overridePendingTransition()。我只是在活动的onPause()方法中对overridePendingTransition(fadein,fadeout)进行了另一个相同的调用。否则,您将看到活动淡入,但在关闭时不会淡出。其他线程上没有答案。我正在删除它。我所说的
    <?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" />