web-dev-qa-db-ja.com

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

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

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

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

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

  1. 製品の詳細を含むMain_Activity(Say Galaxy s3)
  2. ユーザーの検索要求を照会するSearch_Activity

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

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

22

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

<?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の場合、開始アクティビティと終了アクティビティはそれぞれフェードインとフェードアウトするため、切り替えているように見えます。フリップインアニメーションのdurationscale属性は、両方のアニメーションのすべてのstartOffset属性と同じである必要があります。
完璧ではありませんが、私のためにトリックをしました。
それが役に立てば幸い。

38
Fox

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

その理由は、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

4
nbarraille