たとえば、Honeycomb Gmailクライアントが使用するようなスライドをどのように実装する必要がありますか?
フラグメントを追加および削除することでこれを自動的に処理できますTransactionManager
。エミュレータがスライドショーであるため、これをテストするのは難しいです:)
たとえば、Honeycomb Gmailクライアントが使用するようなスライドをどのように実装する必要がありますか?
フラグメントを追加および削除することでこれを自動的に処理できますTransactionManager
。エミュレータがスライドショーであるため、これをテストするのは難しいです:)
フラグメント間の遷移をアニメーション化する、またはフラグメントを表示または非表示にするプロセスをアニメーション化するには、を使用してFragment Manager
を作成しFragment Transaction
ます。
各フラグメントトランザクション内で、表示と非表示にそれぞれ使用されるインアニメーションとアウトアニメーションを指定できます(置換が使用されている場合は両方)。
次のコードは、一方のフラグメントをスライドさせて、もう一方のフラグメントをその場所にスライドさせることにより、フラグメントを置き換える方法を示しています。
FragmentTransaction ft = getFragmentManager().beginTransaction();
ft.setCustomAnimations(R.anim.slide_in_left, R.anim.slide_out_right);
DetailsFragment newFragment = DetailsFragment.newInstance();
ft.replace(R.id.details_fragment_container, newFragment, "detailFragment");
// Start the animated transition.
ft.commit();
単に呼び出すft.show
かft.hide
、または非表示にするフラグメントを渡すことで、フラグメントを非表示または表示することで同じことを実現するには、それぞれ表示または非表示にします。
参考までに、XMLアニメーション定義はobjectAnimator
タグを使用します。slide_in_leftの例は、次のようになります。
<?xml version="1.0" encoding="utf-8"?>
<set>
<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
android:propertyName="x"
android:valueType="floatType"
android:valueFrom="-1280"
android:valueTo="0"
android:duration="500"/>
</set>
サポートライブラリを使用する必要がない場合は、Romanの回答をご覧ください。
ただし、サポートライブラリを使用する場合は、以下で説明する古いアニメーションフレームワークを使用する必要があります。
Retoとblindstuffの回答を調べた後、次のコードが機能するようになりました。
後ろを押すと、破片が右からスライドインし、左にスライドして表示されます。
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction transaction = fragmentManager.beginTransaction();
transaction.setCustomAnimations(R.anim.enter, R.anim.exit, R.anim.pop_enter, R.anim.pop_exit);
CustomFragment newCustomFragment = CustomFragment.newInstance();
transaction.replace(R.id.fragment_container, newCustomFragment );
transaction.addToBackStack(null);
transaction.commit();
順序は重要です。つまり、前に電話する必要があります。そうしないと、アニメーションが有効になりません。setCustomAnimations()
replace()
次に、これらのファイルをres/animフォルダー内に配置する必要があります。
enter.xml:
<?xml version="1.0" encoding="utf-8"?>
<set>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
android:fromXDelta="100%"
android:toXDelta="0"
android:interpolator="@android:anim/decelerate_interpolator"
android:duration="@android:integer/config_mediumAnimTime"/>
</set>
exit.xml:
<set>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
android:fromXDelta="0"
android:toXDelta="-100%"
android:interpolator="@android:anim/accelerate_interpolator"
android:duration="@android:integer/config_mediumAnimTime"/>
</set>
pop_enter.xml:
<set>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
android:fromXDelta="-100%"
android:toXDelta="0"
android:interpolator="@android:anim/decelerate_interpolator"
android:duration="@android:integer/config_mediumAnimTime"/>
</set>
pop_exit.xml:
<?xml version="1.0" encoding="utf-8"?>
<set>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
android:fromXDelta="0"
android:toXDelta="100%"
android:interpolator="@android:anim/accelerate_interpolator"
android:duration="@android:integer/config_mediumAnimTime"/>
</set>
@android:integer/config_shortAnimTime
アニメーションの長さは、または他の数値のようなデフォルト値のいずれかに変更できます。
フラグメントの置換の間に構成の変更(ローテーションなど)が発生した場合、戻るアクションはアニメーション化されないことに注意してください。これは文書化されたバグであり、サポートライブラリのrev20にまだ存在しています。
アニメーションファイルを作成する代わりにこれを使用することを強くお勧めします。これははるかに優れたソリューションだからです。Android Studioには、新しいXMLファイルを作成せずに使用できるデフォルトがすでに用意されています。 animation
アニメーションの名前はandroid.R.anim.slide_in_leftとandroid.R.anim.slide_out_rightであり、次のように使用できます。
FragmentTransaction.setCustomAnimations(android.R.anim.slide_in_left、android.R.anim.slide_out_right);
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.setCustomAnimations(android.R.anim.slide_in_left, android.R.anim.slide_out_right);
fragmentManager.addOnBackStackChangedListener(this);
fragmentTransaction.replace(R.id.frame, firstFragment, "h");
fragmentTransaction.addToBackStack("h");
fragmentTransaction.commit();
出力:
私が変更したサポートライブラリは、フラグメントトランジションにビューアニメーション(つまり<translate>, <rotate>
)とオブジェクトアニメーター(つまり)の両方を使用することをサポートしています。NineOldAndroids<objectAnimator>
で実装されています。詳細については、githubの私のドキュメントを参照してください。
私に関しては、私はビューの方向性が必要です:
で->右からスワイプ
アウト->左にスワイプ
ここで私のために働くコード:
slide_in_right.xml
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate android:fromXDelta="50%p" android:toXDelta="0"
android:duration="@android:integer/config_mediumAnimTime"/>
<alpha android:fromAlpha="0.0" android:toAlpha="1.0"
android:duration="@android:integer/config_mediumAnimTime" />
</set>
slide_out_left.xml
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate android:fromXDelta="0" android:toXDelta="-50%p"
android:duration="@android:integer/config_mediumAnimTime"/>
<alpha android:fromAlpha="1.0" android:toAlpha="0.0"
android:duration="@android:integer/config_mediumAnimTime" />
</set>
トランザクションコード:
inline fun FragmentActivity.setContentFragment(
containerViewId: Int,
backStack: Boolean = false,
isAnimate: Boolean = false,
f: () -> Fragment
): Fragment? {
val manager = supportFragmentManager
return f().apply {
manager.beginTransaction().let {
if (isAnimate)
it.setCustomAnimations(R.anim.slide_in_right, R.anim.slide_out_left)
if (backStack) {
it.replace(containerViewId, this, "Fr").addToBackStack("Fr").commit()
} else {
it.replace(containerViewId, this, "Fr").commit()
}
}
}
}
私はこれを以下の方法で解決します
Animation anim = AnimationUtils.loadAnimation(this, R.anim.slide);
fg.startAnimation(anim);
this.fg.setVisibility(View.VISIBLE); //fg is a View object indicate fragment