该Fragment.onCreateAnimator(int, boolean, int)
方法的整个文档由以下文本组成:
“在片段加载动画时调用。”
而已。没有关于参数的解释。
参数是什么意思?甚至源代码也没有透露太多。
该Fragment.onCreateAnimator(int, boolean, int)
方法的整个文档由以下文本组成:
“在片段加载动画时调用。”
而已。没有关于参数的解释。
参数是什么意思?甚至源代码也没有透露太多。
onCreateAnimator
方法很奇怪。我看到的原型是这样的:
public Animator onCreateAnimator(int transit, boolean enter, int nextAnim)
int transit
- 过渡类型,正如上面所说的sandrstar
boolean enter
- 如果“进入”则为真,否则为假
int nextAnim
-即将播放的动画的资源 ID。
因此,例如,如果您尝试进行卡片翻转,请参阅文档:
// Create and commit a new fragment transaction that adds the fragment for the back of
// the card, uses custom animations, and is part of the fragment manager's back stack.
BackOfCardFragment backFragment = new BackOfCardFragment();
getFragmentManager()
.beginTransaction()
// Replace the default fragment animations with animator resources representing
// rotations when switching to the back of the card, as well as animator
// resources representing rotations when flipping back to the front (e.g. when
// the system Back button is pressed).
.setCustomAnimations(
R.animator.card_flip_right_in, R.animator.card_flip_right_out,
R.animator.card_flip_left_in, R.animator.card_flip_left_out)
// Replace any fragments currently in the container view with a fragment
// representing the next page (indicated by the just-incremented currentPage
// variable).
.replace(R.id.container_view, backFragment)
// Add this transaction to the back stack, allowing users to press Back
// to get to the front of the card.
.addToBackStack(null)
// Commit the transaction.
.commit();
注意:上面示例中的 R.id.container_view 是 ViewGroup 的 ID,其中包含您尝试替换的现有片段。
执行上述代码时,onCreateAnimator
会调用该方法,nextAnim
参数为传入setCustomAnimations()
函数的四个动画ID之一,即R.animator.card_flip_right_in、R.animator.card_flip_right_out...等。
起初这似乎并没有立即有用,因为它没有为您提供可以附加侦听器的实际 Animator 对象的引用。但奇怪的是,您可以直接从nextAnim
资源中为另一个 Animator 充气,然后将侦听器附加到该资源上,奇怪的是,这将在正确的时间触发所有覆盖的回调:
@Override
public Animator onCreateAnimator(int transit, boolean enter, int nextAnim) {
Animator animator = null;
// In this example, i want to add a listener when the card_flip_right_in animation
// is about to happen.
if (nextAnim == R.animator.card_flip_right_in) {
animator = AnimatorInflater.loadAnimator(getActivity(), nextAnim);
// * Sometimes onCreateAnimator will be called and nextAnim will be 0,
// causing animator to be null.
// * I wanted to add a listener when the fragment was entering -
// your use case may be different.
if (animator != null && enter) {
animator.addListener(new Animator.AnimatorListener() {
@Override
public void onAnimationStart(Animator animation) {
// Do something when the card flip animation begins
}
@Override
public void onAnimationEnd(Animator animation) {
// Do something as soon as the card flip animation is over
}
@Override
public void onAnimationCancel(Animator animation) {
}
@Override
public void onAnimationRepeat(Animator animation) {
}
});
}
}
return animator;
}
通过这种方式,您应该能够将侦听器添加到片段转换动画师,就像您自己创建它们一样。
基于FragmentManager代码和FragmentManagerImpl.loadAnimator(android.app.Fragment,int,boolean,int)的用法,似乎Fragment.onCreateAnimator(int, boolean, int)允许您定义自己的动画来隐藏、显示、更改状态。但是,我从未在真正的应用程序中看到过使用它。
关于参数:
int transit
- 转换类型(常量FragmentTransaction,例如在这里使用);boolean enter
-true
如果是状态输入,则为 false - 否则;int transitionStyle
- 来自资源的样式 id(该样式可能包含从 中遗漏的动画onCreateAnimator
);