web-dev-qa-db-ja.com

Android.support.v4.Fragmentの3Dフリップアニメーション

私は現在このチュートリアルを読んでいます:

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

onフラグメントのアニメーションを反転。残念ながら、object-animatorはAndroid.app.Fragmentでのみ使用でき、support Fragmentでは使用できません。

スケールアニメーションと回転アニメーションを使用して、.xmlアニメーションを再構築しようとしました。しかし、現在、アニメーションは実行されておらず、animations .xmlファイルで設定した時間が経過すると、反転する代わりに他のフラグメントが表示されます。

  • .xmlアニメーションの実装を間違えただけですか?
  • または、オブジェクトアニメーターなしで3Dフリップアニメーションを実行することはできませんか?
  • または、サポートフラグメントを使用して3Dフリップアニメーションを実行することはできませんか?

これが私の.xmlアニメーションです:flip_left_in.xml

<set xmlns:Android="http://schemas.Android.com/apk/res/Android" >

  <!-- Before rotating, immediately set the alpha to 0. -->
 <alpha
    Android:valueFrom="1.0"
    Android:valueTo="0.0"
    Android:propertyName="alpha"
    Android:duration="0" />

 <!-- Rotate. -->
 <rotate
    Android:valueFrom="-180"
    Android:valueTo="0"
    Android:propertyName="rotationY"
    Android:interpolator="@Android:anim/accelerate_decelerate_interpolator"
    Android:duration="800"/>

<!-- Half-way through the rotation (see startOffset), set the alpha to 1. -->
<alpha
    Android:valueFrom="0.0"
    Android:valueTo="1.0"
    Android:startOffset="400"
    Android:duration="1" /> 
</set>

flip_left_out.xml

 <set xmlns:Android="http://schemas.Android.com/apk/res/Android" >

   <!-- Rotate. -->
   <rotate
    Android:duration="800"
    Android:interpolator="@Android:anim/accelerate_decelerate_interpolator"
    Android:propertyName="rotationY"
    Android:valueFrom="0"
    Android:valueTo="180" />

<!-- Half-way through the rotation (see startOffset), set the alpha to 0. -->
<alpha
    Android:duration="1"
    Android:propertyName="alpha"
    Android:startOffset="400"
    Android:valueFrom="1.0"
    Android:valueTo="0.0" />

 </set>

flip_right_in.xml

<set xmlns:Android="http://schemas.Android.com/apk/res/Android" >
<!-- Before rotating, immediately set the alpha to 0. -->
<alpha
    Android:duration="0"
    Android:propertyName="alpha"
    Android:valueFrom="1.0"
    Android:valueTo="0.0" />

<!-- Rotate. -->
<rotate
    Android:duration="800"
    Android:interpolator="@Android:anim/accelerate_decelerate_interpolator"
    Android:propertyName="rotationY"
    Android:valueFrom="180"
    Android:valueTo="0" />

<!-- Half-way through the rotation (see startOffset), set the alpha to 1. -->
<alpha
    Android:duration="1"
    Android:propertyName="alpha"
    Android:startOffset="400"
    Android:valueFrom="0.0"
    Android:valueTo="1.0" />

  </set>

flip_right_out.xml

<set xmlns:Android="http://schemas.Android.com/apk/res/Android" >
<!-- Rotate. -->
<rotate
    Android:duration="800"
    Android:interpolator="@Android:anim/accelerate_decelerate_interpolator"
    Android:propertyName="rotationY"
    Android:valueFrom="0"
    Android:valueTo="-180" />

<!-- Half-way through the rotation (see startOffset), set the alpha to 0. -->
<alpha
    Android:duration="1"
    Android:propertyName="alpha"
    Android:startOffset="400"
    Android:valueFrom="1.0"
    Android:valueTo="0.0" />

 </set>

そして、これらが実行されるコードは次のとおりです。

FragmentTransaction trans = getActivity().getSupportFragmentManager().beginTransaction();

trans.setCustomAnimations(R.anim.flip_right_in, R.anim.flip_right_out, 
                           R.anim.flip_left_in, R.anim.flip_left_out);
trans.addToBackStack(null);

trans.replace(R.id.content_frame, new MyFragment()).commit();
21
Philipp Jahoda

NineOldAndroids を使用できます。 Honeycomb(Android 3.0)アニメーションAPIをAndroid 1.0にバックポートします。ObjectAnimator、ValueAnimator、その他すべての優れた機能を利用できます。

3
Anup Cowkur

よろしくお願いします。

私はなんとか問題を解決することができました。このソリューションは、NineOldAndroidsと、NineOldAndroidsのsupport-v4サポートを備えた別のライブラリと関係があります。

私がしたこと:

  • このライブラリをダウンロードしました: https://github.com/kedzie/Support_v4_NineOldAndroids (これはNineOldAndroidsのサポートライブラリです)
  • ワークスペースにインポートしました
  • NineOldAndroidsライブラリをダウンロードして、ワークスペースにインポートしました
  • NineOldAndroidsライブラリをsupport-v4ライブラリにインポートしました
  • Support-v4-nineoldandroidsライブラリをプロジェクトにインポートしました
  • Filp-Animationをしました
2
Philipp Jahoda

以下のapi <3をサポートしていない場合

次のコードと同じコードを使用してください: https://stuff.mit.edu/afs/sipb/project/Android/docs/training/animation/cardflip.html

次のようにflipCardメソッドを微調整しました。

private void flipCard() {
if (mShowingBack) {
    mShowingBack = false;
    FragmentTransaction trans = getActivity().getFragmentManager().beginTransaction();
    trans.setCustomAnimations(R.animator.card_flip_right_in,
            R.animator.card_flip_right_out,
            R.animator.card_flip_left_in,
            R.animator.card_flip_left_out)
         .replace(R.id.memberCardContainer, new CardFrontFragment())
         .commit();
    return;
}

// Flip to the back.
mShowingBack = true;
FragmentTransaction trans = getActivity().getFragmentManager().beginTransaction();
trans.setCustomAnimations(R.animator.card_flip_right_in,
        R.animator.card_flip_right_out,
        R.animator.card_flip_left_in,
        R.animator.card_flip_left_out)
     .replace(R.id.memberCardContainer, new CardBackFragment())
     .commit();
}
0
ReeSen