不同的退出/进入动画

6

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

目前我已经有以下内容:

清单文件:

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

Styles.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 中定义的其他过渡动画。

我的问题:

当我从样式 B 的活动中关闭一个活动时,来自样式 CustomDialogAnimationandroid:windowExitAnimation 没有被使用。相反,播放了来自样式 CustomActivityAnimationandroid:activityCloseExitAnimation

有什么提示吗?


1
你能通过GIF/视频演示一下这个行为吗?现在你手头有什么,以及你想要实现什么还不太清楚。 - azizbekian
1
我编辑了我的帖子。上传视频很困难。如果还不清楚,我会尽力解决的。 - Prexx
1
尝试在活动中添加 Style A 中定义的 Style B 的动画,因为虽然您已经为它们设置了对话框主题,但是您仍在活动中使用它们。 - Nainal
1
@Nainal 尝试了,不起作用。 - Prexx
1
可以在运行时指定样式,而无需在 Styles.xml 中定义! - Gaurang Goda
显示剩余2条评论
2个回答

2

针对您的目的,您可以在运行时按以下方式设置:

我们总共需要四个动画,并且将通过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一样简单,Activity类为我们提供了一个称为overridePendingTransition的方法,我们可以使用它来设置正在退出和进入的Activites的动画,如下所示:
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);
}

credit

参考来源

1
我不想在每个活动中添加该代码。这就是为什么我将其定义在styles.xml中的原因。 - Prexx
1
你有两个活动,并且你正在为第二个活动使用对话框主题,这样做有什么特定的原因吗?为什么不在单一代码形式样式中定义进入和退出? - Gaurang Goda
不是期望的行为。 - Prexx

1
尝试更改对话框动画的父级: <style name="CustomDialogAnimation" parent="@style/Animation.AppCompat.Dialog"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接