如何在activity的finish()方法中添加动画效果?

106

我在创建活动时使用overridePendingTransition,可以看到淡入效果非常好,但当我尝试对活动的finish进行动画处理时,它仍然执行默认的从右到左滑动。

我最初尝试在启动活动时定义out动画,如下所示:

Intent myIntent = new Intent(a, SkdyAlert.class);
    myIntent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
    a.startActivity(myIntent);
    if (android.os.Build.VERSION.SDK_INT > android.os.Build.VERSION_CODES.DONUT) {
        AnimationHelper.overridePendingTransition(a, R.anim.fadein, R.anim.fadeout);
    }

然后我尝试在活动结束后进行操作

okBtn.setOnClickListener(new OnClickListener() {
        public void onClick(View v) {
            finish();
            if (android.os.Build.VERSION.SDK_INT > android.os.Build.VERSION_CODES.DONUT) {
                AnimationHelper.overridePendingTransition(activity, 0, R.anim.fadeout);
            }
        }
    });

但是这两种方法都不能防止“从右到左”的退出动画滑动。有什么想法,我做错了什么吗?

8个回答

243

在我调用 finish() 后,我覆盖了待处理的转换。

在我的情况下,我这样做是为了避免过渡效果。

finish();
Details.this.overridePendingTransition(R.anim.nothing,R.anim.nothing);

顺序很重要 :)


6
“Details”中,@Goofyahead正为他的封闭Activity命名--可能因人而异。这种技术适用于我替换2.x上Theme.Dialog动画,但不适用于3.x或4.x。 - larham1
10
“R.anim.nothing”是什么样子? - sandalone
使用@Felipe Micaroni Lalli的答案,0表示没有动画。 - Yeung
这个链接也帮助了我。它解释了如何定义自己的动画:https://dev59.com/oW435IYBdhLWcg3w4Uas - Adam
27
你可以重写 finish() 方法,以避免在所有情况下进行过渡(例如按下返回按钮):@Override public void finish() { super.finish(); overridePendingTransition(0, 0); } - eugeneek
以上的转换仅在开发者选项中启用时执行,请参见https://dev59.com/cnA75IYBdhLWcg3wRWsU#30422015。 - CoolMind

42

这个问题已经有了答案,但是在退出一个Activity时添加动画的最有效方法是通过覆盖相关Activity的"finish()"方法:

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

1
这可能是被接受的答案。 - Parthi

26

我建议在onPause()方法中使用isFinishing()方法来配置动画,而不是调用finish()方法。

@Override
protected void onPause() {
    super.onPause();
    if (isFinishing()){
        overridePendingTransition(R.anim.activity_slide_in, R.anim.activity_slide_out);
    }

}

为什么这样更好? - Manuel

23
finish();
overridePendingTransition(0, 0);

20

我使用以下方法解决了这个问题:

开启动画效果:

 Intent newUser = new Intent(getBaseContext(), NewUserActivity.class);
    startActivity(newUser);
    overridePendingTransition(R.anim.slide_in_right,R.anim.slide_out_left);

以动画方式关闭:

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    onBackPressed();
    return super.onOptionsItemSelected(item);
}

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

12

可以通过主题来实现。您可以为活动或整个应用程序定义进入和退出动画。


是的!就是这样。嗯,有点吧。我已经应用了一个主题,并且这个主题定义了一个动画,所以这就是为什么我自己的动画无法工作的原因。非常感谢你的见解! - b-ryce
3
你能否给我一个提示,告诉我在哪里可以找到主题提供的转场效果。我还想将自定义的转场效果应用到所有页面,但不知道如何操作。 - 0xPixelfrost
@Zapnologica,我之前为类似问题给出的另一个答案更加详细。https://dev59.com/5FTTa4cB1Zd3GeqPpib2#4940610 - Nathan Schwermann

6

接下来是对@schwiz回答的补充。这里有一个针对内置对话框主题的动画覆盖,我定义了本地的slide_up和slide_down动画。我的活动指定了MyDialog主题,以便具有这些进入和退出过渡效果。

<style name="Animation.MyDialog" parent="android:Animation.Dialog">
    <item name="android:windowEnterAnimation">@anim/slide_up</item>
    <item name="android:windowExitAnimation">@anim/slide_down</item>
</style>

<style name="Theme.MyDialog" parent="android:Theme.Dialog">
    <item name="android:windowAnimationStyle">@style/Animation.MyDialog</item>
</style>


6
使用startActivityForResult启动子活动,在父活动的onActivityResult()中:
    @Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if(requestCode==REQUEST_YOUR_ACTIVITY) {
        overridePendingTransition(R.anim.parent_appearing_anim, R.anim.child_dissmissing_anim);
    }
    super.onActivityResult(requestCode, resultCode, arg2);
}

这适用于后退按键(物理按钮)。要使其也与“向上”箭头一起工作,请参见此答案:https://dev59.com/aHnZa4cB1Zd3GeqPqnsm#20161352 - lenooh
需要注意的是:在调用super.onActivityResult之前,必须先调用overridePendingTransition。否则,挂起的转换将不会被覆盖! - goemic

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