Androidフラグメントとアニメーション
-
26-10-2019 - |
質問
たとえば、Honeycomb Gmailクライアントが使用する種類のスライドをどのように実装する必要がありますか?
できる TransactionManager
フラグメントを追加および削除することにより、これを自動的に処理します。エミュレータがスライドショーであるため、これをテストするのはちょっと難しいです:)
解決
フラグメント間の遷移をアニメーション化するか、使用するフラグメントを表示または隠すプロセスをアニメーション化するために Fragment Manager
Aを作成します Fragment Transaction
.
各フラグメントトランザクション内で、表示および非表示にそれぞれ使用する(または交換が使用された場合)に使用されるアニメーションを指定できます。
次のコードは、1つのフラグメントをスライドさせ、その場所のもう1つをスライドさせることにより、フラグメントをどのように置き換えるかを示しています。
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>
他のヒント
サポートライブラリを使用する必要がない場合は、 ローマの 答え。
ただし、使用したい場合 サポートライブラリ 以下に説明するように、古いアニメーションフレームワークを使用する必要があります。
コンサルティング後 reto's と 盲検 回答私は次のコードを動作させました。
フラグメントが表示されます 右からスライドします と 左にスライドします バックが押されたとき。
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
または他の番号。
フラグメントの交換の間に構成の変更が発生した場合(たとえば回転)、バックアクションがアニメーション化されていないことに注意してください。これは 文書化されたバグ それはまだサポートライブラリのRev 20に存在しています。
アニメーションファイルを作成する代わりに、これを使用することを強くお勧めします。これは、はるかに優れたソリューションであるためです。 Android Studioはすでに提供しています デフォルト animation
新しいXMLファイルを作成せずに使用できます。アニメーションの名前はです 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>
)およびオブジェクトアニメーター(つまり、 <objectAnimator>
)フラグメント遷移用。で実装されています 9つのオルダンドロイド. 。詳細については、GitHubのドキュメントを参照してください。
私はこれを以下で解決します
Animation anim = AnimationUtils.loadAnimation(this, R.anim.slide);
fg.startAnimation(anim);
this.fg.setVisibility(View.VISIBLE); //fg is a View object indicate fragment
私に関しては、ビューディレクトが必要です:
in->右からスワイプします
out->左にスワイプします
ここで私のために機能しますコード:
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()
}
}
}
}