web-dev-qa-db-ja.com

アクティビティをスムーズに出し入れするためのoverridePendingTransition

ボタンを押すだけでアクティビティをスライドインおよびスライドアウトする方法がわかりません。私が欲しいのは、ユーザーがボタンを押してから、画面がスライドすることです。私が望む方法は、最初のアクティビティ(ボタンのあるアクティビティ)を左にスライドさせ、新しい2番目のアクティビティを右からスライドさせることです。

以下のコードでは、ボタンがクリックされると、最初のアクティビティが左にスライドしたいときに右にスライドします。その後、スライドが完了すると、残っているものは一瞬黒い画面になり、2番目のアクティビティが表示されるだけで、スライドしません。

そのため、最初のアクティビティは間違った方向にスライドし、次のアクティビティはスライドする代わりに表示されます。私は何を間違えていますか? XMLファイルの理解に苦労しているので、以下のすべてのコードを聞いてください。

最初の活動

_@Override
public void onCreate(Bundle savedInstanceState) {

    playBtn.setOnClickListener(new OnClickListener() {
        public void onClick(View v) {
            Intent intent = new Intent(MainMenu.this, Levels.class);
            startActivity(intent);
            overridePendingTransition(R.anim.enter_from_right, R.anim.exit_out_left);
        }
    });
_

第二の活動

_@Override
public void onCreate(Bundle savedInstanceState) {
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    super.onCreate(savedInstanceState);
    setContentView(R.layout.levels);

    overridePendingTransition(R.anim.enter_from_left, R.anim.exit_out_right);
_

したがって、XMLファイルの一部が間違っている可能性があると考えています。どうぞ。

enter_from_left.xml

_<?xml version="1.0" encoding="utf-8"?>
<set 
    xmlns:Android="http://schemas.Android.com/apk/res/Android" >

    <translate
        Android:duration="600"
        Android:fromXDelta="100%"
        Android:toXDelta="0%" >
    </translate>
</set>
_

enter_from_right.xml

_<?xml version="1.0" encoding="utf-8"?>
<set 
    xmlns:Android="http://schemas.Android.com/apk/res/Android" >

    <translate
        Android:duration="600"
        Android:fromXDelta="-100%"
        Android:toXDelta="0%" >
    </translate>
</set>
_

exit_out_left.xml

_<?xml version="1.0" encoding="utf-8"?>
<set 
    xmlns:Android="http://schemas.Android.com/apk/res/Android" >

    <translate
        Android:duration="600"
        Android:fromXDelta="0%"
        Android:toXDelta="-100%" >
    </translate>
</set>
_

exit_out_right.xml

_<?xml version="1.0" encoding="utf-8"?>
<set 
    xmlns:Android="http://schemas.Android.com/apk/res/Android" >

    <translate
        Android:duration="600"
        Android:fromXDelta="0%"
        Android:toXDelta="100%" >
    </translate>
</set>
_

[〜#〜] edit [〜#〜] 2番目のアクティビティからoverridePendingTransition()を削除することで、1番目のアクティビティが左にスライドしたので、私はそれを望んでいました。ただし、1番目のアクティビティがスライドすると、2番目のアクティビティが右からスライドするのではなく、黒い画面が表示されるだけです。

19
Matt

startActivity()と新しいアクティビティonCreate()の両方でアニメーションをオーバーライドする代わりに、startActivity()呼び出しの直後にアニメーションをオーバーライドするだけで済みます。

overridePendingTransition(int enterAnim, int exitAnim)に指定する2つのintsは、2つのアニメーションに対応します-古いActivityを削除し、新しいものを追加します。

2番目の質問については、fromXDeltaの設定が間違っていると思います。-100%は、画面の右側ではなく、の外側にあるはずなので、これを100%に変更する必要があります。修理する。

19
panini

私の要点を見て、それは完全に動作します:

1.CommonActivityのstartActivityをオーバーライドして終了する

 @Override
    public void startActivity(Intent intent) {
        super.startActivity(intent);
        overridePendingTransition(R.anim.from_right_in, R.anim.from_left_out);
    }

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

2.from_left_in.xml

    <set xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <translate Android:fromXDelta="-100%p"
               Android:toXDelta="0"
               Android:duration="300"/>
    <alpha Android:fromAlpha="0.0" Android:toAlpha="1.0" Android:duration="300" />
   </set>

3.from_right_in.xml

   <set xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <translate Android:fromXDelta="100%p"
               Android:toXDelta="0"              Android:interpolator="@Android:interpolator/accelerate_decelerate"
               Android:duration="300"/>
    <alpha Android:fromAlpha="0.0" Android:toAlpha="1.0" Android:duration="300" />
</set>

4. from_left_out.xml

   <set xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <translate Android:fromXDelta="0"
               Android:toXDelta="-100%p"
               Android:duration="300"/>
    <alpha Android:fromAlpha="1.0" Android:toAlpha="0.0" Android:duration="300" />
</set>

5. from_right_out.xml

<set xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <translate Android:fromXDelta="0"
               Android:toXDelta="100%p"
               Android:duration="300"/>
    <alpha Android:fromAlpha="1.0" Android:toAlpha="0.0" Android:duration="300" />
</set>

要旨リンク: https://Gist.github.com/JagieChen/f5cc44bf663f3722bd19097be47ccf9b

7
Jagie

Enter_from_rightアニメーションにはエラーがあり、-100%ではなく100%のfromXDeltaが必要ですが、enter_from_leftアニメーションにも100%ではなく-100%のfromXDeltaが必要です。

乾杯、

1
mircobabini