Androidでのアクティビティの移行


188

Android 1.5以降の2つのアクティビティ間の遷移を定義するにはどうすればよいですか?フェードインするアクティビティをお願いします。


7
overridePendingTransition下記のすべての関連する回答に適用されます:(0, 0)アニメーションがまったく必要ない場合は合格です。
ドッカエビ

回答:


164

これはで行えますActivity.overridePendingTransition()。XMLリソースファイルで簡単な遷移アニメーションを定義できます。


iandismeに感謝します。overridePengingTransitionはAPIレベル5です。これをレベル3(Android 1.5)で行うことはできませんか?
hpique 2010

ああ、そうです。CaseyBの答えは、おそらくあなたが探しているものに沿っているでしょう。
iandisme 2010

CaseyBの答えで適切なフェードインを行う方法をまだ見つけていません。
hpique

1
アクティビティのonCreate関数でこれを行うことができます。
mxcl 2012年

1
HTCで機能するには、設定>表示>アニメーションをすべてに変更する必要があります(少なくともHTC Desire HDでは)。
ウルボス

191

2つのアクティビティ間で滑らかなフェードを実行するコードを次に示します。

ファイルを作成fadein.xml中にres/anim

<?xml version="1.0" encoding="utf-8"?>
<alpha xmlns:android="http://schemas.android.com/apk/res/android"
   android:interpolator="@android:anim/accelerate_interpolator"
   android:fromAlpha="0.0" android:toAlpha="1.0" android:duration="2000" />

ファイルを作成fadeout.xml中にres/anim

<?xml version="1.0" encoding="utf-8"?>

<alpha xmlns:android="http://schemas.android.com/apk/res/android"
   android:interpolator="@android:anim/accelerate_interpolator"
   android:fromAlpha="1.0" android:toAlpha="0.0" android:duration="2000" />

アクティビティAからアクティビティBにフェードインする場合はonCreate()アクティビティBのメソッドに以下を入力します。前setContentView()に私のために働く。

overridePendingTransition(R.anim.fadein, R.anim.fadeout);

フェードが遅すぎる場合は、android:duration上記のxmlファイルを小さい値に変更してください。


53
これに追加するだけです。OSがアクティビティを閉じることを決定した直後に、overridePendingTransition()を再度呼び出す必要があります。ActivityのonPause()メソッドに、overridePendingTransition(fadein、fadeout)への同じ呼び出しを追加しました。それ以外の場合は、アクティビティがフェードインしますが、閉じてもフェードアウトしません。
ネイト

2
他のスレッドでは回答はありません。削除しています。私が経験しているのは、トランジションがすぐに発生し、その後暗くなってフェードインするというものです。つまり、アクティビティAにあり、アクティビティBが表示されてから、暗くなってフェードインします。アクティビティAのonPause()にコードを追加すると、同じ動作が得られます。
ギークオンハグ12年

12
組み込みのAndroidアニメーションを使用すると、移行がスムーズになるoverridePendingTransition(android.R.anim.fadein, android.R.anim.fadeout); ようです。これらのファイルを表示すると、カスタムアニメーションを改善する方法についてのヒントも得られます(たとえば、フェードインをフェードアウトよりも長くするなど)。
Dan J

3
ただ、変更するのを忘れていないfadeinfadeoutするfade_infade_out。Dan Jの投稿より
ファリッド

1
ドキュメントによると、あなたが呼び出す必要がありますoverridePendingTransition()呼び出した後、右finish()および/またはstartActivity()。新しいアクティビティを起動した直後に呼び出すことで、この方法で素晴らしいフェードを得ることができました。
イオノクラストブリガム

50

これを行う簡単な方法は次のとおりです。

  1. アニメーションスタイルをstyles.xmlファイルに作成します
<style name="WindowAnimationTransition">
    <item name="android:windowEnterAnimation">@android:anim/fade_in</item>
    <item name="android:windowExitAnimation">@android:anim/fade_out</item>
</style>
  1. このスタイルをアプリのテーマに追加します
<style name="AppBaseTheme" parent="Theme.Material.Light.DarkActionBar">
      <item name="android:windowAnimationStyle">@style/WindowAnimationTransition</item>
</style>

それでおしまい :)


31

はい。アクティビティにどのような移行をしたいかをOSに伝えることができます。

@Override
public void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    getWindow().setWindowAnimations(ANIMATION);

    ...

}

ここで、ANIMATIONは、OSに組み込まれたアニメーションを参照する整数です。


それが機能するために何か他のことをする必要がありますか?getWindow()。setWindowAnimations(android.R.anim.fade_in)は、デフォルトで使用されたプッシュトランジションにはなりませんが、フェードトランジションにもなりません。新しいアクティビティは、Nexus Oneデバイスの以前のアクティビティの上に表示されます。
hpique

1
これは、リソースを要求するのではなく、OSに組み込まれた遷移アニメーションのIDを要求するためです。 developer.android.com/intl/fr/reference/android/view/...
CaseyB

4
setWindowAnimationsはスタイルリソースのみを受け入れるようです。getWindow()。setWindowAnimations(android.R.style.Animation_Toast)は、フェードインに最も近いことがわかりましたが、前のアクティビティではなく、黒からフェードインします。
hpique

1
OSにアニメーションを組み込む必要はありません。値でカスタムアニメーションを定義できます。
ilija139

1
@ ilija139、よろしいですか?ここにdeveloper.android.com/reference/android/view/…とあります:「これはシステムリソースである必要があります。ウィンドウマネージャーがアプリケーションにアクセスできないため、アプリケーションリソースにすることはできません。」
ラピス

29

res> anim> fadein.xmlを作成します。

<?xml version="1.0" encoding="utf-8"?>
    <alpha xmlns:android="http://schemas.android.com/apk/res/android"
       android:interpolator="@android:anim/accelerate_interpolator"
       android:fromAlpha="0.0" android:toAlpha="1.0" android:duration="500" />

res> anim> fadeout.xmlを作成します。

<?xml version="1.0" encoding="utf-8"?>
    <alpha xmlns:android="http://schemas.android.com/apk/res/android"
       android:interpolator="@android:anim/accelerate_interpolator"
       android:fromAlpha="1.0" android:toAlpha="0.0" android:duration="500" />

res> values> styles.xml

<style name="Fade">
        <item name="android:windowEnterAnimation">@anim/fadein</item>
        <item name="android:windowExitAnimation">@anim/fadeout</item>
    </style>

onCreate()アクティビティ

getWindow().getAttributes().windowAnimations = R.style.Fade;

2
それをテーマに追加して、すべてのアクティビティに適用することをお勧めしますか?
Peterdk

12
これらのアニメーションは、すでにAndroidの中で定義されており、単純にすべての活動の)(onPauseに次のコードを追加しますoverridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out);
ELAD Navaの

はい、アニメーションを編集者が好きなように編集できることを示したかっただけです。
IceSteve


25

デフォルトのアクティビティアニメーションを上書きします。私はそれがスムーズに動作することをapi 15でテストします。これが私が使用する解決策です:

<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
    <!-- Customize your theme here. -->
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorPrimary</item>
    <item name="android:windowAnimationStyle">@style/CustomActivityAnimation</item>

</style>

<style name="CustomActivityAnimation" parent="@android:style/Animation.Activity">
    <item name="android:activityOpenEnterAnimation">@anim/slide_in_right</item>
    <item name="android:activityOpenExitAnimation">@anim/slide_out_left</item>
    <item name="android:activityCloseEnterAnimation">@anim/slide_in_left</item>
    <item name="android:activityCloseExitAnimation">@anim/slide_out_right</item>
</style>

resフォルダーの下にanimフォルダーを作成してから、次の4つのアニメーションファイルを作成します。

slide_in_right.xml

<?xml version="1.0" encoding="utf-8"?>

<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate android:fromXDelta="100%p" android:toXDelta="0"
        android:duration="@android:integer/config_mediumAnimTime"/>
</set>

slide_out_left.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate android:fromXDelta="0" android:toXDelta="-100%p"
        android:duration="@android:integer/config_mediumAnimTime"/>
</set>

slide_in_left.xml

<?xml version="1.0" encoding="utf-8"?>

<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate android:fromXDelta="-100%p" android:toXDelta="0"
        android:duration="@android:integer/config_mediumAnimTime"/>
</set>

slide_out_right.xml

<?xml version="1.0" encoding="utf-8"?>

<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate android:fromXDelta="0" android:toXDelta="100%p"
        android:duration="@android:integer/config_mediumAnimTime"/>
</set>

私のサンプルプロジェクトをダウンロードできます。

それで全部です... :)


これは受理された回答でなければなりません。うまくいきます!
EdgeDev

24

次のコードは、2つのアクティビティ間をスムーズに移動します。

  1. 左から右への滑らかな効果

    res / animにslide_in_right.xmlおよびslide_out_right.xmlというファイルを作成します。

    slide_in_right.xml

        <?xml version="1.0" encoding="utf-8"?>
        <set xmlns:android="http://schemas.android.com/apk/res/android"
            android:shareInterpolator="false" >
            <translate android:duration="5000" android:fromXDelta="100%" android:toXDelta="0%" />
            <alpha android:duration="5000" android:fromAlpha="0.0" android:toAlpha="1.0" />
        </set>

    slide_out_right.xml

    <?xml version="1.0" encoding="utf-8"?>
    <set xmlns:android="http://schemas.android.com/apk/res/android"
        android:shareInterpolator="false" >
        <translate android:duration="5000" android:fromXDelta="0%" android:toXDelta="-100%"/>
        <alpha android:duration="5000" android:fromAlpha="1.0" android:toAlpha="0.0" />
    </set>
  2. 右から左に滑らかな効果

    res / animにanimation_enter.xmlおよびanimation_leave.xmlというファイルを作成します。

    animation_enter.xml

       <set xmlns:android="http://schemas.android.com/apk/res/android"
        android:shareInterpolator="false">
        <translate android:fromXDelta="-100%" android:toXDelta="0%"
            android:fromYDelta="0%" android:toYDelta="0%"
            android:duration="700"/>
       </set>

    animation_leave.xml

      <set xmlns:android="http://schemas.android.com/apk/res/android"
        android:shareInterpolator="false">
        <translate
            android:fromXDelta="0%" android:toXDelta="100%"
            android:fromYDelta="0%" android:toYDelta="0%"
            android:duration="700" />
      </set>
  3. 1つのアクティビティから2番目のアクティビティに移動する

       Intent intent_next=new Intent(One_Activity.this,Second_Activity.class);
       overridePendingTransition(R.anim.slide_in_right,R.anim.slide_out_right);
       startActivity(intent_next);
     finish();

    4.バックプレスイベントまたは2番目のアクティビティから1つのアクティビティに移動

     Intent home_intent = new Intent(Second_Activity.this, One_Activity.class);
     overridePendingTransition(R.anim.animation_enter, R.anim.animation_leave);
     startActivity(home_intent);
     finish();

3
overridePendingTransitionは3でstartActivityした後でなければなりません
アーベルク

overridePendingTransitionは、3と4のstartActivityの後である必要があります
Tareq

overridePendingTransition()がstartActivity()の前に置かれた場合、私にとっては機能しません
Fernando Tan

呼び出す必要がありますoverridePendingTransitionすぐ後に startActivity:developer.android.com/reference/android/app/...
Midhun MP

4

Android 1.5ではoverridePendingTransitionを使用できません。overridePendingTransistionはAndroid 2.0で導入されました。

エラーなしでこれを実行する場合は、通常のアニメーション(または独自のアニメーション)を使用してターゲット(1.5以上)をコンパイルするか、overridePendingTransistionを使用してターゲット(2.0以上)をコンパイルする必要があります。

概要:Android 1.5ではoverridePendingTransistionを使用できません

ただし、OSに組み込まれているアニメーションを使用できます。


不正解です。アニメーションは1.6より前のAndroidにあり、オーバーライドを使用してoverridePendingTransistionを使用し、1.5をターゲットにすることができます。
hpique

まあ、私の間違い。投稿を更新しました。独自のアニメーションを作成し、1.5で必要に応じてそれらをカスタマイズできます。それはAPIレベル5に表示されるように始めて以来、しかし、あなたはまだoverridePendingTransition使用することはできません
カーテン

2

IN GALAXYデバイス:

[設定]> [開発者向けオプション]を使用して、デバイスでオフにしていないことを確認する必要があります。

2つのマペット


LGデバイスでも:)
Ultimo_m '19 / 07/15

私はそう思いますが、私はそれを試し
ませ

素晴らしい!トランジションとアニメーションを数時間検索したところ、あなたの答えが見つかりました。
CoolMind 2016

1

ActivityCompat.startActivity()を使用すると、API> 21で動作します。

    ActivityOptionsCompat options = ActivityOptionsCompat.makeSceneTransitionAnimation(activity, transitionImage, EXTRA_IMAGE);
    ActivityCompat.startActivity(activity, intent, options.toBundle());

1

インテントを開始する前に:

ActivityOptions options = ActivityOptions.makeSceneTransitionAnimation(AlbumListActivity.this);
startActivity(intent, options.toBundle());

これにより、アクティビティの遷移にデフォルトのアニメーションが提供されます。


0

Androidの一部のバージョンはカスタムActivity遷移をサポートし、一部はサポートしていません(古いデバイス)。カスタムトランジションを使用したい場合Activityは、overridePendingTransition()メソッド。古いバージョンの場合はそうではありません。

メソッドが存在するかどうかを知るには、リフレクションAPIを使用できます。メソッドが存在するかどうかを確認して返す単純なコードを次に示します。

Method mOverridePendingTransition;

try {
        mOverridePendingTransition = Activity.class.getMethod(
                "overridePendingTransition", new Class[] { Integer.TYPE, Integer.TYPE } );
        /* success */
    } catch (NoSuchMethodException nsme) {
        /* failure, this version of Android doesn't have this method */
    } 

次に、独自の遷移を適用できます。つまり、このメソッドが存在する場合は、このメソッドを使用します。

if (UIConstants.mOverridePendingTransition != null) {
               try {
                   UIConstants.mOverridePendingTransition.invoke(MainActivity.this, R.anim.activity_fade_in, R.anim.activity_fade_out);
               } catch (InvocationTargetException e) {
                   e.printStackTrace();
               } catch (IllegalAccessException e) {
                   e.printStackTrace();
               }
            }

ここでは、例として、簡単なフェードインおよびフェードアウトアニメーションがトランジションのデモに使用されました。


0

ズームインアニメーション

Intent i = new Intent(getApplicationContext(), LoginActivity.class);
 overridePendingTransition(R.anim.zoom_enter, R.anim.zoom_exit);
startActivity(i);
finish();

zoom_enter

<?xml version="1.0" encoding="utf-8"?>
<alpha xmlns:android="http://schemas.android.com/apk/res/android"
    android:interpolator="@android:anim/accelerate_interpolator"
    android:fromAlpha="0.0" android:toAlpha="1.0"
    android:duration="500" />

zoom_exit

<alpha xmlns:android="http://schemas.android.com/apk/res/android"
    android:interpolator="@android:anim/accelerate_interpolator"
    android:fromAlpha="1.0" android:toAlpha="0.0"
    android:fillAfter="true"
    android:duration="500" />
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.