首页 > 解决方案 > 不同的退出/进入动画

问题描述

我想为不同的活动定义两种窗口动画样式。

这是我到目前为止所拥有的:

显现:

<application
    ...>
    <activity
        android:name=".MainActivity"
        android:screenOrientation="portrait"
        android:theme="@style/A" />
    <activity
        android:name=".SecondActivity"
        android:screenOrientation="portrait"
        android:theme="@style/B" />
</application>

样式.xml:

<style name="A" parent="AppTheme">
    <item name="android:windowAnimationStyle">@style/CustomActivityAnimation</item>
</style>

<style name="CustomActivityAnimation" parent="@android:style/Animation.Activity">
    <item name="android:activityOpenEnterAnimation">@anim/bottom_in</item>
    <item name="android:activityOpenExitAnimation">@anim/scale_out</item>
    <item name="android:activityCloseEnterAnimation">@anim/scale_in</item>
    <item name="android:activityCloseExitAnimation">@anim/bottom_out</item>
</style>


<style name="B" parent="@style/Theme.AppCompat.Light.Dialog">
    <item name="android:windowAnimationStyle">@style/CustomDialogAnimation</item>
</style>

<style name="CustomDialogAnimation" parent="@android:style/Animation.Dialog">
   <item name="android:windowEnterAnimation">@anim/dialog_in</item>
   <item name="android:windowExitAnimation">@anim/dialog_out</item>
</style>

我想要实现的是:

带有样式A的活动之间的转换应使用CustomActivityAnimation.

具有样式的活动B被设置为对话框,并且应该在CustomDialogAnimation.

我的问题:

当我从android:windowExitAnimationstyleCustomDialogAnimation关闭活动时,从不使用 from 样式B。而是播放android:activityCloseExitAnimationfrom 风格CustomActivityAnimation

有什么提示吗?

标签: androidanimation

解决方案


为了您的目的,您可以在运行时提供它,如下所示:

我们总共需要四个动画,我们将通过 XML 定义它们。在四个动画中,实际上有两组。第一个是将视图从其当前位置移动到视图外的位置,第二个是将视图从视图外带入。

定义动画 XML 文件:

slide_to_left.xml:

<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate android:fromXDelta="0" android:toXDelta="-100%p"
               android:interpolator="@android:anim/accelerate_decelerate_interpolator"
               android:duration="300"/>
</set>

slide_to_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:interpolator="@android:anim/accelerate_decelerate_interpolator"
               android:duration="300"/>
</set>

slide_from_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:interpolator="@android:anim/accelerate_decelerate_interpolator"
               android:duration="300"/> 

slide_from_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:interpolator="@android:anim/accelerate_decelerate_interpolator"
               android:duration="300"/>
</set>

为活动之间的过渡设置动画同样容易。Activity 类为我们提供了一个名为 overridePendingTransition 的方法,我们可以使用它来设置退出和进入 Activity 的动画,如下所示:

Intent intent = new Intent(this, B.class);
startActivity(intent);
overridePendingTransition(R.anim.slide_from_right, R.anim.slide_to_left);

使用我们之前定义的动画,我们可以让新的 Activity 从视图的右侧滑入,而当前的 Activity 从视图的左侧滑出。

类似地,当新的 Activity 完成时,我们可以执行反向动画让完成的 Activity 滑出视图到右侧,而前一个 Activity 从左侧滑回视图:

finish();
overridePendingTransition(R.anim.slide_from_left, R.anim.slide_to_right);

后退按钮处理:

@Override
public void onBackPressed() {
    super.onBackPressed();
    overridePendingTransition(R.anim.slide_from_left, R.anim.slide_to_right);
}

信用


推荐阅读