2017-03-16 9 views
0

私はAndroidでアプリケーションを開発しています。私はユーザから情報を取得するためにフローを使用しています。フローを構築するために、私はいくつかのフラグメントを使用しています。 5つのステップがあり、5つのフラグメントを使用しています。私はリストビューを使用して保存した前のレコードを表示するために別のフラグメントを使用しています。私の活動では、Expandという名前のボタンを使用しています。 Expandボタンは、フラグメントを使用して前のレコードを表示するために使用されます。ユーザーがボタンをクリックすると、フラグメントが展開され、展開ボタンのテキストが非表示に設定されます。ボタンのテキストが非表示の場合、ユーザーがボタンを再度クリックすると、フラグメントがスタックから削除され、前のフラグメントがバックスタックに追加されます。Androidでのフラグメント取引のための上下のアニメーション

例えば、FragmentA、FragmentB、FragmentC、FragmentD、FragmentEという名前の5つのフラグメントと、以前にListViewに保存されたレコードを、名前の付いたボタンのクリックイベントで表示するために使用するProjectRowsFragmentという別のフラグメントがあるとします。展開します。

ユーザがFragmentCにいて、Expandボタンをクリックしたとします。何が起こるかは、FragmentCが置き換えられ、ProjectRowsFragmentが追加されるということです。ユーザーがボタンを再度クリックすると、ProjectRowsFragmentが置き換えられ、FragmentCがバックスタックから取り込まれます。それがFragmentDだった場合、それは置き換えられ、ProjectRowsFragmentが追加されます。ユーザーがボタンを再度クリックすると、ProjectRowsFragmentが置き換えられ、FragmentDが​​バックスタックから取り込まれます。

私は取引を行っています。

私が望むのは、ProjectRowsFragment(レコードを表示するために使用しているフラグメント)が表示され置き換えられている間に、アニメーションを追加したいということです。表示されているときは上から下にスライドし、後ろのスタックから取り除かれると上にスライドします。

多くの試しをした後、私はスライドダウンエフェクトを達成しましたが、どのようにスライドアップアニメーションを取得できますか?

ここは私のコードです。

fragmentManager = getFragmentManager(); 
fragmentTransaction = fragmentManager.beginTransaction(); 
fragmentTransaction.setCustomAnimations(R.animator.slide_in_from_top, 0, R.animator.slide_in_from_bottom, 0); 
fragmentTransaction.replace(R.id.fragment_container, ProjectRowsFragment.newInstance(this.projectId)); 
fragmentTransaction.addToBackStack(null); 
fragmentTransaction.commit(); 
projectRowsExpanded = true; 

slide_in_from_top.xmlファイルは、ユーザーがボタンをクリックすると示された場合、私は

最初のステップ

enter image description here

を視覚化するために3枚の画像を持っている

ここ
<?xml version="1.0" encoding="utf-8"?> 
<set xmlns:android="http://schemas.android.com/apk/res/android" 
android:fillAfter="true" > 
<objectAnimator 
    android:duration="600" 
    android:propertyName="y" 
    android:valueFrom="-1280" 
    android:valueTo="0" 
    android:valueType="floatType" /> 
</set> 

ですリストが配置されます。

enter image description here

ユーザが指示ボタンで再びクリックします。

代わりにフラグメントにカスタムアニメーションを適用するので

enter image description here

+0

でのご渡す4つのパラメータあなたの 'setCustomAnimations'。 '.setCustomAnimations(in、out)'という2つのパラメータだけを試すことができます。 –

答えて

0

、あなたが展開したり折りたたんだりするために以下の機能をお使いのフラグメントのコンテナビューを渡すことによって、あなたのFrameLayoutにアニメーションを追加することができます。

FrameLayout v = (FrameLayout) findViewById(R.id.fragment_container); 
expand(v); //To Expand 
collapse(v); //To Collapse 


public static void expand(final View v) { 
    v.measure(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT); 
    final int targetHeight = v.getMeasuredHeight(); 

    v.getLayoutParams().height = 1; 
    v.setVisibility(View.VISIBLE); 
    Animation a = new Animation() { 
     @Override 
     protected void applyTransformation(float interpolatedTime, Transformation t) { 
      v.getLayoutParams().height = interpolatedTime == 1 
        ? ViewGroup.LayoutParams.WRAP_CONTENT 
        : (int) (targetHeight * interpolatedTime); 
      v.requestLayout(); 
     } 

     @Override 
     public boolean willChangeBounds() { 
      return true; 
     } 
    }; 

    a.setDuration((int) (targetHeight/v.getContext().getResources().getDisplayMetrics().density)); 
    v.startAnimation(a); 
} 

public static void collapse(final View v) { 
    final int initialHeight = v.getMeasuredHeight(); 

    Animation a = new Animation() { 
     @Override 
     protected void applyTransformation(float interpolatedTime, Transformation t) { 
      if (interpolatedTime == 1) { 
       v.setVisibility(View.GONE); 
      } else { 
       v.getLayoutParams().height = initialHeight - (int) (initialHeight * interpolatedTime); 
       v.requestLayout(); 
      } 
     } 

     @Override 
     public boolean willChangeBounds() { 
      return true; 
     } 
    }; 

    a.setDuration((int) (initialHeight/v.getContext().getResources().getDisplayMetrics().density)); 
    v.startAnimation(a); 
} 
関連する問題