誰かがこれに出くわしたら...
Android 開発者トレーニングWeb サイトのサンプル プロジェクトを使用して、これを理解しました。res に anim フォルダーを作成し、オブジェクト animator タグを使用して xml セット ファイルを追加しました。目的のアニメーションを取得するために値を正しく操作する方法を理解していませんでしたが、いくつか突っ込んだ後、次のことに気付きました
<objectAnimator
android:valueFrom=
android:valueTo=
android:propertyName="
android:interpolator=
android:duration= />
valueFrom タグと valueTo タグは、アニメーションが実行されるポイントを定義し、android が残りを埋めます。プロパティ名は、操作されているモーションの種類 (translationX、translationY、rotationX、translationY、scaleX、および scaleY) を記述するために使用されます。補間器はアニメーションの変化率を設定し、最後に期間はアニメーションにかかる時間を指定します。
アニメーション ファイルが作成されると、次のコードを使用して、トランザクション中にフラグメントにアニメーションを設定できます。
getFragmentManager()
.beginTransaction()
.setCustomAnimations(
R.animator.exampleOut, R.animator.exampleIn,
R.animator.exampleOut, R.animator.exampleIn,
).add(R.id.container, new mFragment()).addToBackStack(null).commit();\
setCustomAnimations() の最初の 2 つのパラメータは、トランザクションが開始されたときの 2 つのフラグメントのモーションを設定し、最後の 2 つのパラメータは、トランザクションが逆になったとき、つまり戻るボタンが押されたときの 2 つのフラグメントのモーションを設定します。
これを使用して目的のアニメーションを実現できますが、何らかの理由でアウトバウンド フラグメントが表示されなくなることがわかりました。そのため、次のように AnimatorListener を使用する必要がありました。
Animator.AnimatorListener listener = new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator arg0) {
getFragmentManager()
.beginTransaction()
.setCustomAnimations(
R.animator.exampleOut, 0,
0, R.animator.exampleIn
)
.add(R.id.container, new mFragment())
.addToBackStack(null)
.commit();
}
};
slideback(listener);
mHandler.post(new Runnable() {
@Override
public void run() {
invalidateOptionsMenu();
}
});
}
private void slideback(Animator.AnimatorListener listener) {
View movingFragmentView = cardFrontFragment.getView();
PropertyValuesHolder rotateY = PropertyValuesHolder.ofFloat("rotationY", 15f);
PropertyValuesHolder scaleX = PropertyValuesHolder.ofFloat("scaleX", 0.8f);
PropertyValuesHolder scaleY = PropertyValuesHolder.ofFloat("scaleY", 0.8f);
PropertyValuesHolder translateX = PropertyValuesHolder.ofFloat("translationX", 500f);
ObjectAnimator movingFragmentAnimator = ObjectAnimator.
ofPropertyValuesHolder(movingFragmentView, rotateY, scaleX, scaleY, translateX);
ObjectAnimator movingFragmentRotator = ObjectAnimator.
ofFloat(movingFragmentView, "rotationY",15f, 0f);
movingFragmentAnimator.setDuration(DURATION_TIME);
movingFragmentRotator.setStartDelay(DELAY_TIME);
AnimatorSet s = new AnimatorSet();
s.playTogether(movingFragmentAnimator, movingFragmentRotator);
s.addListener(listener);
s.start();
}
private void slideForward (Animator.AnimatorListener listener) {
View movingFragmentView = cardFrontFragment.getView();
PropertyValuesHolder rotateY = PropertyValuesHolder.ofFloat("rotationY", 15f);
PropertyValuesHolder scaleX = PropertyValuesHolder.ofFloat("scaleX", 1.0f);
PropertyValuesHolder scaleY = PropertyValuesHolder.ofFloat("scaleY", 1.0f);
PropertyValuesHolder translateX = PropertyValuesHolder.ofFloat("translationX", 0f);
ObjectAnimator movingFragmentAnimator = ObjectAnimator.
ofPropertyValuesHolder(movingFragmentView, rotateY, scaleX, scaleY, translateX);
ObjectAnimator movingFragmentRotator = ObjectAnimator.
ofFloat(movingFragmentView, "rotationY",15f, 0f);
movingFragmentAnimator.setDuration(DURATION_TIME);
movingFragmentRotator.setStartDelay(DELAY_TIME);
movingFragmentRotator.setDuration(DURATION_TIME);
AnimatorSet s = new AnimatorSet();
s.playTogether(movingFragmentAnimator, movingFragmentRotator);
s.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
mShowingBack = false;
}
});
s.start();
}
これにより、実行時にアウトバウンド フラグメントのプロパティを動的に設定でき、何らかの理由でフラグメントを表示したままにすることができます。