活动退出动画在 Android 4.0 上无法按预期工作



我有一个主题可以更改活动的打开/关闭/进入/退出动画:

<style name="down_up_theme" parent="Theme.rtlfr">
    <item name="android:windowAnimationStyle">@style/down_up_animation</item>
</style>
<style name="down_up_animation" parent="@android:style/Animation.Activity">
    <item name="android:activityOpenEnterAnimation">@anim/slide_in_top</item>
    <item name="android:activityOpenExitAnimation">@anim/hold</item>
    <item name="android:activityCloseEnterAnimation">@anim/hold</item>
    <item name="android:activityCloseExitAnimation">@anim/slide_out_bottom</item>
</style>

在清单中:

<activity android:name=".activity.ArticlesActivity"
        android:theme="@style/down_up_theme" />

目标是使活动内容在开始时向下滑动,在结束时向上滑动。

动画在2.3上运行良好。不过,在4.0上,退出动画(向上滑动)不起作用。它所做的动画是关闭由该活动派生的活动。在我的例子中,我想用文章列表来动画活动的结束,而不是用向上滑动的动画来动画文章细节的结束。

我想我可以尝试将结束动画添加到生成我想要动画的活动中,但它实际上生成了应该有不同动画的活动。我在文档中也找不到任何关于2.3与4.0差异的信息。

如何使我的动画在4.0上工作?

我不知道为什么主题中设置的退出动画在ICS+上不起作用,但调用overridePendingTransition()似乎起作用。对您来说,最简单的方法可能是覆盖活动中的finish()

@Override
public void finish() {
    super.finish();
    overridePendingTransition(R.anim.hold, R.anim.slide_out_bottom);
}

我想在这个答案上再加一点;覆盖动画解决方案运行良好,但您可能不想对动画进行硬编码。从清单中获取它们会很好,就像对平台的其他版本一样。。所以…

在活动中添加几个成员字段,以保存附加到活动的动画的id。。

protected int activityCloseEnterAnimation;
protected int activityCloseExitAnimation;

以及onCreate中的某个位置。。。

// Retrieve the animations set in the theme applied to this activity in the
// manifest..
TypedArray activityStyle = getTheme().obtainStyledAttributes(new int[] {android.R.attr.windowAnimationStyle});
int windowAnimationStyleResId = activityStyle.getResourceId(0, 0);      
activityStyle.recycle();
// Now retrieve the resource ids of the actual animations used in the animation style pointed to by 
// the window animation resource id.
activityStyle = getTheme().obtainStyledAttributes(windowAnimationStyleResId, new int[] {android.R.attr.activityCloseEnterAnimation, android.R.attr.activityCloseExitAnimation});
activityCloseEnterAnimation = activityStyle.getResourceId(0, 0);
activityCloseExitAnimation = activityStyle.getResourceId(1, 0);
activityStyle.recycle();

那么无论你的活动在哪里结束/应该应用动画包括。。。

overridePendingTransition(activityCloseEnterAnimation, activityCloseExitAnimation);

你的活动应该正确地尊重你在清单中活动的主题/风格中设置的动画。

我也被这个问题弄糊涂了。但幸运的是,不久之后我找到了答案。您应该检查动画文件的根元素是否为"Set"。如果不是,您应该用"Set"元素包裹它,然后ActivityCloseAnimation属性就会正常工作。我试过了。希望能对你有所帮助。

您应该在这里使用overridePendingTransitionwindowEnterAnimation/windowExitAnimation应该为您的

最新更新