web-dev-qa-db-ja.com

下からのアクティビティアニメーションのスライド

私が使用するもの:

activity_stay.xml

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

    <translate
        Android:duration="@Android:integer/config_longAnimTime"
        Android:fromYDelta="0%p"
        Android:toYDelta="0%p" />

</set>

activity_slide_to_bottom.xml

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

    <translate
        Android:duration="@Android:integer/config_longAnimTime"
        Android:fromYDelta="0"
        Android:toYDelta="100%p" />

</set>

activity_slide_from_bottom.xml

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

    <translate
        Android:duration="@Android:integer/config_longAnimTime"
        Android:fromYDelta="100%p"
        Android:toYDelta="0" />

</set>

NewActivityを開始します。

startActivity(NewActivity.getIntent(this))
overridePendingTransition(R.anim.activity_slide_from_bottom, R.anim.activity_stay)

NewActivity finish():

finish()
overridePendingTransition(R.anim.activity_stay, R.anim.activity_slide_to_bottom)

NewActivityが開始されると、OldActivityは消えます-NewActivityが上にスライドする空白の白い画面が表示されます。しかし、必要なのは、開始時にOldActivityコンテンツの上にスライドするNewActivityです。どうすればこれを達成できますか?

[〜#〜] upd [〜#〜]:何らかの理由でNewActivityを終了すると、すべてのアニメーションが完全に実行されます。

14
oleg.v

以下のコードを使用してアニメーションを実現できます。

bottom_up.xml:

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <translate
        Android:duration="1000"
        Android:fromYDelta="90%"
        Android:toYDelta="0" />
</set>

bottom_down.xml:

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <translate
        Android:duration="1500"
        Android:fromYDelta="5"
        Android:toYDelta="90%" />
</set>

nothing.xml:

<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:duration="1000"
    Android:fromYDelta="0%p"
    Android:toYDelta="0%p" />

2番目のアクティビティを開始:

Intent intent = new Intent(MainActivity.this, SecondActivity.class);
startActivity(intent);
overridePendingTransition(R.anim.bottom_up, R.anim.nothing);

2番目のアクティビティの終了時:

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

ドキュメント:

アニメーションを使用してアクティビティを開始するマテリアルデザインアプリのアクティビティ遷移は、一般的な要素間の動きと変換を通じて、異なる状態間の視覚的な接続を提供します。開始遷移と終了遷移、およびアクティビティ間の共有要素の遷移にカスタムアニメーションを指定できます。

入力遷移は、アクティビティのビューがシーンに入る方法を決定します。たとえば、爆発入力遷移では、ビューが外部からシーンに入り、画面の中央に向かって飛びます。終了遷移は、アクティビティ内のビューがシーンを終了する方法を決定します。たとえば、爆発終了トランジションでは、ビューは中心から離れてシーンを終了します。

カスタムトランジションを指定するまず、マテリアルテーマから継承するスタイルを定義するときに、Android:windowActivityTransitions属性を使用してウィンドウコンテンツのトランジションを有効にします。スタイル定義で、入力、終了、共有要素の遷移を指定することもできます。

<style name="BaseAppTheme" parent="Android:Theme.Material">   <!-- enable window content transitions -->   
<item name="Android:windowActivityTransitions">true</item>
  <!-- specify enter and exit transitions -->   
<item name="Android:windowEnterTransition">@transition/explode</item>   
<item name="Android:windowExitTransition">@transition/explode</item> </style>

ドキュメントを確認してください。 ここ

enter image description here

楽しい!!

20
SANAT

activity_slide_from_bottom.xml

_<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:duration="@Android:integer/config_longAnimTime"
    Android:fromYDelta="100%p"
    Android:toYDelta="0%p" />
_

activity_slide_to_bottom.xml

_<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:duration="@Android:integer/config_longAnimTime"
    Android:fromYDelta="0%p"
    Android:toYDelta="100%p" />
_

activity_stay.xml

_<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:duration="1000"
    Android:fromYDelta="0%p"
    Android:toYDelta="0%p" />
_

NewActivityを開始:

_startActivity(NewActivity.getIntent(this));
overridePendingTransition(R.anim.activity_slide_from_bottom, R.anim.activity_stay)
_

NewActivity finish():

_@Override
public void onBackPressed() {
    super.onBackPressed();
    overridePendingTransition(R.anim.activity_stay, R.anim.activity_slide_to_bottom);
}
_

また、アニメーションはスタイルで宣言できます

_<style name="Animation.MyCustomAnimation" parent="Android:style/Animation.Activity">
    <item name="Android:activityOpenEnterAnimation">@anim/activity_slide_from_bottom</item>
    <item name="Android:activityOpenExitAnimation">@anim/activity_stay</item>
    <item name="Android:activityCloseEnterAnimation">@anim/activity_stay</item>
    <item name="Android:activityCloseExitAnimation">@anim/activity_slide_to_bottom</item>
</style>
_

このスタイルをテーマに設定します。

_<style name="Theme.MyAnimTheme" parent="YourThemeParent">
    <item name="Android:windowAnimationStyle">@style/Animation.MyCustomAnimation</item>
</style>
_

マニフェストでテーマをアクティビティに設定します

_<activity
    Android:name=".NewActivity"
    Android:theme="@style/Theme.MyCustomTheme" />
_

Android:activityOpenEnterAnimation

新しいアクティビティを開くとき、これは次のアクティビティ(画面に入る)で実行されるアニメーションです

Android:activityOpenExitAnimation

新しいアクティビティを開くとき、これは前のアクティビティで実行されるアニメーションです(画面を終了します)。

Android:activityCloseEnterAnimation

現在のアクティビティを閉じるとき、これは次のアクティビティ(画面に入る)で実行されるアニメーションです。

Android:activityCloseExitAnimation

現在のアクティビティを閉じるとき、これは現在のアクティビティで実行されるアニメーションです(画面を終了します)。

Android:windowReenterTransition

以前に開始されたアクティビティから戻るときにシーンにビューを移動するために使用される目的のトランジションを定義するトランジションXMLリソースへの参照。 Window.setReenterTransition(Android.transition.Transition).に対応

Android:windowReturnTransitionWindowが閉じる準備をしているときにビューをシーンの外に移動するために使用する目的のトランジションを定義するトランジションXMLリソースへの参照。 Window.setReturnTransition(Android.transition.Transition).に対応

リファレンス: https://developer.Android.com/reference/Android/R.attr

10
Bhuvanesh BS

Animations APIは、達成しようとしていることからTransitions APIよりも望ましいと思います。詳細な説明は次のとおりです。 https://www.reddit.com/r/androiddev/comments/8wqjzv/difference_between_animation_and_transitions_api/

3
toobsco42

ドキュメントによると:

public void overridePendingTransition(int enterAnim、int exitAnim)startActivity(Intent)またはfinish()のフレーバーのいずれかの直後に呼び出して、次に実行する明示的な遷移アニメーションを指定します。

Build.VERSION_CODES.JELLY_BEANの時点で、これをアクティビティの開始で使用する代わりに、ActivityOptionsバンドルを介してstartActivity(Intent、Bundle)または関連する関数に目的のアニメーション情報を提供します。これにより、現在のトップアクティビティのコンテキスト外からアクティビティを開始する場合でも、カスタムアニメーションを指定できます。

つまり、overridePendingTransition(R.anim.activity_stay, R.anim.activity_slide_to_bottom)の後にstartActivity(Intent, Bundle)を追加するだけで、必要な結果が得られるはずです。

編集:

Android:activityOpenEnterAnimation Android:activityOpenExitAnimation Android:activityCloseEnterAnimation Android:activityCloseExitAnimation

活動に影響を与える

Android:windowEnterTransition Android:windowExitAnimation Android:windowReenterTransition Android:windowReturnTransition

ウィンドウに影響を与えます

アクティビティとウィンドウの詳細について:

アクティビティにはウィンドウ(ユーザーインターフェイスを描画するウィンドウ)があり、

ウィンドウには、単一のSurfaceとそれに接続された単一のビュー階層があります。

surfaceには、ビューを保持するViewGroupが含まれます。

ソース: Android window? とは

結論として、同じ結果を得るためにそれらを使用できますが、それらは異なります。

3

最善の方法はスタイルを使用することです。これは、すべてのアクティビティでこのアニメーションが必要な場合に備えて、すべてのアクティビティでコーディングする必要がないためです。

私が常に使用する最も短い方法

すべてのアクティビティでスライドテーマを設定するには

<application
    Android:theme="@style/Theme.SlideAnimWindow"
    ...
    >

1つのアクティビティにスライドテーマを設定するには

<activity
    Android:name=".YourActivity"
    Android:theme="@style/Theme.SlideAnimWindow" />

slide_from_bottom.xmlres> animに入れます。

<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:duration="@Android:integer/config_longAnimTime"
    Android:fromYDelta="100%p"
    Android:toYDelta="0%p" />

res> animslide_to_bottom.xmlを入力します。

<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:duration="@Android:integer/config_longAnimTime"
    Android:fromYDelta="0%p"
    Android:toYDelta="100%p" />

res.animnone.xmlを入れます。

<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:duration="1000"
    Android:fromYDelta="0%p"
    Android:toYDelta="0%p" />

このスタイルをres> values> styles.xmlに入れます

<style name="SlideAnimation" parent="Android:style/Animation.Activity">
    <item name="Android:activityOpenEnterAnimation">@anim/slide_from_bottom</item>
    <item name="Android:activityOpenExitAnimation">@anim/none</item>
    <item name="Android:activityCloseEnterAnimation">@anim/none</item>
    <item name="Android:activityCloseExitAnimation">@anim/slide_to_bottom</item>
</style>

<style name="Theme.SlideAnimWindow" parent="AppTheme">
    <item name="Android:windowAnimationStyle">@style/SlideAnimation</item>
</style>

を変えることができます Android:duration="@Android:integer/config_longAnimTime"必要に応じた期間。これで準備完了です。

1
Khemraj

以下を試してください、

slide_in_up.xml

<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:duration="@Android:integer/config_longAnimTime"
    Android:fromYDelta="100%p"
    Android:toYDelta="0%p" />

slide_out_down.xml

<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:duration="@Android:integer/config_longAnimTime"
    Android:fromYDelta="0%p"
    Android:toYDelta="100%p" />

no_anim.xml

<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:duration="1000"
    Android:fromYDelta="0%p"
    Android:toYDelta="0%p" />

NewActivityを開始:

startActivity(NewActivity.getIntent(this))
overridePendingTransition(R.anim.slide_in_up, R.anim.no_anim);

NewActivity finish():

finish();
overridePendingTransition(R.anim.no_anim, R.anim.slide_out_down);
1
Sagar Zala