0

私はViewPager with Fragmentsを持っています。各フラグメントは、「カード」の前面を持つImageViewで構成されています。スワイプすると、次の(または前の)カードが表示されます。ボタンをクリックすると、他のランダムなカードがランダムに表示されます。別のボタンをクリックすると、カードの裏側を示すフリップカードアニメーション、または裏側がすでに表示されている場合は、フリップカードアニメーションが後ろに(同じカード)表示されます。 フリップカードアニメーションを取得するには、アニメーション化されるフラグメントが、ビューページに直接ではなくコンテナになければなりません。しかし、フラグメント・コンテナ(フラグメントも)をビュー・ペーパに入れようとすると、ビュー・ページ・メカニズム全体がネジ止めされます。通常のスワイプはもはや不可能です。フリップカード効果でアニメーション化するために、フラグメントを含むコンテナをViewPager内に配置するにはどうすればいいですか?

同じ/類似の質問が前に質問されました:https://stackoverflow.com/questions/22171069/how-can-i-animate-a-fragment-inside-a-viewpager?。受け入れられた答えは私の質問に答えていませんが、この答えを探している人が増えていることをコメントに示しています。

私は多くのインターネットを閲覧していますが、私は続行しますが、私が問題のために見つけた答えの大半は、stackoverflow-usersから来たので、ここに質問を投稿することにしました!

コメントで質問を明確にするために編集 私が使用したいアニメーションは、p.e.としてコンテナで動作します。

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent" 
xmlns:tools="http://schemas.android.com/tools" 
android:orientation="vertical" 
android:fitsSystemWindows="true" 
tools:context="nl.xxx.xxx.xxxActivity" 
tools:ignore="MergeRootFrame"> 


<LinearLayout 
    android:id="@+id/container" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:layout_margin="15dp" 
    /> 
</FrameLayout> 

アニメーションの前に、imageViewを持つフラグメントがコンテナ(FrontFragment)に追加されます。このフラグメントのレイアウト:

<ImageView xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools" 
android:id="@+id/imageDisplay" 
android:layout_width="match_parent" 
android:layout_height="wrap_content" 
android:padding="16dp" 
tools:context="nl.xxx.xxx.xxxActivity" /> 

アニメーションが(コードの一部である:)

 mShowingBack = true; 

    // Create and commit a new fragment transaction that adds the fragment for the back of 
    // the card, uses custom animations, and is part of the fragment manager's back stack. 
    BackFragment achterkant= BackFragment.newInstance("blabla"); 

    getFragmentManager() 
      .beginTransaction() 

      // Replace the default fragment animations with animator resources representing 
      // rotations when switching to the back of the card, as well as animator 
      // resources representing rotations when flipping back to the front (e.g. when 
      // the system Back button is pressed). 
      .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 any fragments currently in the container view with a fragment 

      .replace(R.id.container, achterkant) 

      // Add this transaction to the back stack, allowing users to press Back 
      // to get to the front of the card. 
      .addToBackStack(null) 

      // Commit the transaction. 
      .commit(); 

アニメーションは、例えば、XMLファイル、で与えられる:card_flip_left_in.xml:

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

<!-- Rotate. --> 
<objectAnimator 
    android:valueFrom="-180" 
    android:valueTo="0" 
    android:propertyName="rotationY" 
    android:interpolator="@android:interpolator/accelerate_decelerate" 
    android:duration="@integer/card_flip_time_full" /> 

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

上記のコードはインターネットから複製されており、 wpagerの状況。

+0

ご迷惑をおかけいたします。コンテナにあなたのフラグメントを置き換えたい、あるいはコンテナであなたのカードを置き換えるようにします。 – Kathi

+0

"フリップカードアニメーションを取得するには、アニメーション化されるフラグメントがビューページに直接ではなくコンテナ内にある必要があります。私はこれが何を意味するのか分かりません。あなたの 'Fragment'の中で' ImageView'をアニメーション化できないのはなぜですか?なぜ、2番目にネストされたフラグメントが必要ですか? – PPartisan

+0

@Partisanを明確にするために質問を編集しました – Lucy

答えて

0

私は自分自身で答えを見つけました。 ViewPagerにコンテナ付きのRootFragmentsを追加しました。私は、コンテナ内のフラグメントをgetChildFragmentManager()と上記のオブジェクトアニメータの助けを借りて置き換えたり、アニメートしたりします。

私はandroid.support.v13ライブラリ(FragmentStatePagerAdapter)をandroid.app.Fragmentおよびandroid.app.FragmentTransactionと組み合わせて使用​​しなければならないという事実にヒントがありました。

関連する問題