如何向活动finish()添加动画


98

我在创建活动时使用了overridePendingTransition,并且效果很好,我可以看到淡入效果很好,但是当我尝试对活动的结束进行动画处理时,它仍在执行默认的从右到左滑动。

开始活动时,我首先尝试定义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);
            }
        }
    });

但是,这两种方法都不会阻止退出动画从右向左滑动。关于我在做什么错的任何想法吗?

Answers:


228

我在调用finish()之后就覆盖了挂起的过渡;

就我而言,我这样做是为了避免过渡。

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

顺序很重要:)


5
通过“ Details”,@ Goofyahead正在命名其所附的Activity --ymmv。这种技术对我有用,它可以替换2.x上的Theme.Dialog上的动画,但不能替换3.x或4.x上的动画
larham1 2012年

8
怎么R.anim.nothing样子?
sandalone 2013年

使用@Felipe Micaroni Lalli答案,0表示无动画。

这样也帮助了我。它解释了如何定义自己的动画:stackoverflow.com/questions/5151591/…–
亚当

23
您可以覆盖finish()方法以避免在所有情况下都发生过渡(按下后退按钮,作为示例): @Override public void finish() { super.finish(); overridePendingTransition(0, 0); }
eugeneek

29

这个问题已经回答了,但是在退出活动时放动画的最有效方法是重写相关活动的“ finish()”方法:

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

24

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

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

}

为什么这样更好?
曼努埃尔


19

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

用动画打开:

 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 2010年

3
您能给我一个提示,从哪里看主题将传递哪些横断面。我也想为所有网站设置自定义过渡,但我不知道如何。
LuckyMalaka 2011年

@Zapnologica这是我为类似问题提供的另一个答案,它的发音更加清楚。stackoverflow.com/questions/4940574/...
弥敦道Schwermann

6

在@schwiz回答之后,这是内置Dialog主题的动画替代,在其中定义了本地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>


5

使用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
lenooh 2016年

重要注意事项:在调用super.onActivityResult之前,需要先调用overridePendingTransition。否则,下垂过渡将不会被覆盖!
goemic
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.