Honeycomb Gmailクライアントが使用するようなスライドをどのように実装すべきですか?
TransactionManager
フラグメントを追加および削除することでこれを自動的に処理できます。エミュレーターがスライドショーであるため、これをテストするのは少し難しいです:)
Honeycomb Gmailクライアントが使用するようなスライドをどのように実装すべきですか?
TransactionManager
フラグメントを追加および削除することでこれを自動的に処理できます。エミュレーターがスライドショーであるため、これをテストするのは少し難しいです:)
回答:
フラグメント間の遷移をアニメーション化したり、フラグメントを表示または非表示にするプロセスをアニメーション化したりして、Fragment Manager
を作成しFragment Transaction
ます。
各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
やその他の数値に変更できます。
フラグメントの置換の間に構成の変更(ローテーションなど)が発生した場合、バックアクションはアニメーション化されないことに注意してください。これはサポートライブラリのリビジョン20にまだ存在する文書化されたバグです。
アニメーションファイルを作成する代わりにこれを使用することを強くお勧めします。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>
)とオブジェクトアニメーター(つまり<objectAnimator>
)の両方の使用をサポートしています。NineOldAndroidsで実装されています。詳細については、githubにある私のドキュメントを参照してください。
私に関しては、私はビューdiractionが必要です:
で->右からスワイプ
アウト->左にスワイプ
ここで私のために働くコード:
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