アニメーションをアクティビティに追加するにはどうすればよいでしょうfinish()


98

アクティビティが作成されて正常に機能する場合にoverridePendingTransitionを使用していますが、フェードインがうまく機能しているのがわかりますが、アクティビティの終了をアニメーション化しようとしても、デフォルトの右から左へのスライドを実行しています。

最初に、次のようにアクティビティを開始するときにアウトアニメーションを定義してみました。

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);
            }
        }
    });

しかし、これらのアプローチはどちらも、終了アニメーションの「右から左」のスライドを妨げません。私が間違っていることについて何かアイデアはありますか?

回答:


228

finish()を呼び出した直後に、保留中の遷移をオーバーライドします。

私の場合、私は移行を避けるためにそれをしました。

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

順序は重要です:)


5
「詳細」によって、@ Goofyaheadは彼の囲みアクティビティに名前を付けます-ymmv。この手法は、私にとって2.xのTheme.Dialogのアニメーションを置き換えるのに役立ちましたが、3.xや4.xではできませんでした
larham1

8
どのようにR.anim.nothing見えますか?
Sandalone 2013

@Felipe Micaroni Lalliの回答を使用してください。0はアニメーションなしを意味します。
Yeung

これも私を助けてくれました。:それはあなた自身のアニメーションを定義する方法について説明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

私は、finish()を呼び出す代わりに、isFinishing()メソッドを使用してonPauseでアニメーションを構成することをお勧めします

@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

3
どのトランジションがテーマによって配信されるかを確認するためのヒントを教えてください。すべてのサイトにカスタム移行を設定したいのですが、方法がわかりません。
LuckyMalaka

@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

注意すべき重要事項:super.onActivityResultを呼び出す前に、overridePendingTransitionを呼び出す必要があります。それ以外の場合、pendintトランジションはオーバーライドされません!
風変わりな
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.