22

アクティビティ間でカードフリップアニメーションを実行する方法

http://developer.android.com/training/animation/cardflip.html

上記のリンクは静的レイアウトを切り替えます..動的レイアウトを持つ2つのアクティビティ間を実行したいです..CardFlipよろしくお願いします..:)

私には2つの活動があります...

  1. 製品の詳細が含まれているA Main_Activity(Say Galaxy s3)
  2. Search_Activityユーザーの検索要求を照会するA。

に検索ボタンがありますMain_Activity。ボタンをクリックすると、Main_Activityビューはカードをに反転する必要がありますSearch_Activity。同様に、ユーザーが製品を選択すると、Card-Flipその逆になります。

上記のURLのように実装しようとしましたが、。を使用して定義された2つの静的レイアウト間でのみ反転しXMLます。そして、私は検索を実装していますActionBar

4

3 に答える 3

39

私が得たものから、あなたは活動の間でまったく同じカードフリップをすることはできません。
ただし、アクティビティ間の遷移をアニメーション化するために
必要なことはすでにご存知かもしれませんが(ドキュメントはこちら)。これで必要なのは、トリックを実行するためのアニメーションリソースだけです。私はこれらを使用しました: fade_in.xmloverridePendingTransition()

<?xml version="1.0" encoding="utf-8"?><set xmlns:android="http://schemas.android.com/apk/res/android" >
<scale
    android:duration="200"
    android:fromXScale="0.0"
    android:fromYScale="1.0"
    android:interpolator="@android:anim/accelerate_decelerate_interpolator"
    android:pivotX="50%"
    android:pivotY="50%"
    android:startOffset="200"
    android:toXScale="1.0"
    android:toYScale="1.0" />

<alpha
    android:duration="1"
    android:fromAlpha="0.0"
    android:startOffset="200"
    android:toAlpha="1.0" />
</set>

およびfade_out.xml

<?xml version="1.0" encoding="utf-8"?><set xmlns:android="http://schemas.android.com/apk/res/android" >
<scale
    android:duration="200"
    android:fromXScale="1.0"
    android:fromYScale="1.0"
    android:interpolator="@android:anim/accelerate_decelerate_interpolator"
    android:pivotX="50%"
    android:pivotY="50%"
    android:toXScale="0.0"
    android:toYScale="1.0" />

<alpha
    android:duration="1"
    android:fromAlpha="1.0"
    android:startOffset="200"
    android:toAlpha="0.0" />
</set>

回転アニメーションは、特定のピボット位置(x、y座標)でZ軸(画面に入る軸)を中心にのみ回転するため、Y軸を中心に反転することはできません。
私がやったことは、活動が横向きになっているような錯覚を生み出す高さを保ちながら、中央付近の幅を拡大縮小することです。また、幅が0の場合、開始アクティビティと終了アクティビティはそれぞれフェードインとフェードアウトするため、切り替えているように見えます。フリップインアニメーションののduration属性は、両方のアニメーションのscaleすべての属性と同じである必要があります。 完璧ではありませんが、私のためにトリックをしました。 それが役に立てば幸い。startOffset

于 2013-09-09T08:50:31.680 に答える
4

受け入れられた回答に記載されているように、アクティビティ間でカードフリップアニメーションを実行することはできません(これは、新しいアクティビティを画面の中央から横に拡張するだけです)。

その理由は、を呼び出すときに、現在開いているアクティビティではなく、開始overridePendingTransition()するアクティビティにアニメーションを適用しているだけだからです。

リンクされている(非常に優れた)チュートリアルには、合計4つのアニメーションがあり、トランジションごとに2つのアニメーションがあります(1つは画面に入るフラグメント用、もう1つは画面から出るフラグメント用)。

これが私がその問題を解決し、2つのアクティビティ間でフリップカードアニメーションを作成した方法ですが、それは私のアクティビティの内容に非常に習慣的です。状況によっては、最初のアクティビティに全画面画像が含まれていて、その画像を同じサイズの別のビューに反転させたいだけでした。

  1. を呼び出して、自動ウィンドウアニメーションを無効にしますoverridePendingTransition(0, 0)
  2. 2番目のアクティビティへのバンドルで、ビューを再作成するための新しいアクティビティに十分な情報を渡します(私にとっては、画像のサイズと位置、およびロードするリソースでした)
  3. 新しいビューにonPreDrawListenerを設定します。ここで、親アクティビティのビュー(私の場合は画像)を再作成します。
  4. 2つのビューを反転するだけです。そのために、あなたが投稿したフリップカードフラグメント遷移チュートリアルにあったコードを書き直し、ObjectAnimatorsを使用してコードで書き直しました。
  5. メソッドをオーバーライドしてonBackPressed()、同じアニメーションを逆の順序で実行します

このメカニズムを使用すると、ビュー間をアニメーション化するだけなので、絶対に任意のカスタム遷移を実行できます。そのテクニックに関する詳細は次のとおりです:https ://www.youtube.com/watch?v = ihzZrS69i_s#t = 1001

于 2014-08-11T18:20:36.737 に答える
3

2つのアクティビティ間でこのようなカードフリップアニメーション(添付のgif)を作成できます。

2つのアクティビティ間のカードフリップアニメーション

次の手順を実行します:

まず、アニメーションでXMLfade_in.xmlを 作成しますres > anim > fade_in.xml

およびfade_in.xml

<?xml version="1.0" encoding="utf-8"?><set xmlns:android="http://schemas.android.com/apk/res/android" >
    <scale
        android:duration="2000"
        android:fromXScale="0.0"
        android:fromYScale="1.0"
        android:interpolator="@android:anim/accelerate_decelerate_interpolator"
        android:pivotX="50%"
        android:pivotY="50%"
        android:startOffset="2000"
        android:toXScale="1.0"
        android:toYScale="1.0" />

    <alpha
        android:duration="1"
        android:fromAlpha="0.0"
        android:startOffset="2000"
        android:toAlpha="1.0" />
</set>

fade_out.xml次に、anim で2番目のXMLを作成しますres > anim > fade_out.xml

およびfade_out.xml

<?xml version="1.0" encoding="utf-8"?><set xmlns:android="http://schemas.android.com/apk/res/android" >
    <scale
        android:duration="2000"
        android:fromXScale="1.0"
        android:fromYScale="1.0"
        android:interpolator="@android:anim/accelerate_decelerate_interpolator"
        android:pivotX="50%"
        android:pivotY="50%"
        android:toXScale="0.0"
        android:toYScale="1.0" />

    <alpha
        android:duration="1"
        android:fromAlpha="1.0"
        android:startOffset="2000" 
        android:toAlpha="0.0" />
</set>

両方のanimXMLを作成した後、内部に値を設定しますres>value>style.xml

ここで、このコードを慎重に内部に追加して、すべてのアクティビティでカードフリップアニメーションstyle.xmlを設定します。(選択した2つのアクティビティの間にこのアニメーションが必要な場合は、でアニメーションを設定します。).java

コードを追加する style.xml

<resources>

    <!-- Base application theme. -->
    <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>    

                            <!-- add code below -->
       <item name="android:windowAnimationStyle">@style/CustomActivityAnimation</item>
   </style>

   <style name="CustomActivityAnimation" parent="@android:style/Animation.Activity">
       <item name="android:activityOpenEnterAnimation">@anim/fade_in</item>
       <item name="android:activityOpenExitAnimation">@anim/fade_out</item>
       <item name="android:activityCloseEnterAnimation">@anim/fade_in</item>
       <item name="android:activityCloseExitAnimation">@anim/fade_out</item>
   </style>

</resources>

ありがとう !!ハッピーコーディング:)

于 2020-04-06T09:23:27.127 に答える