Fragment.onCreateAnimator()的文档在哪里?

Fragment.onCreateAnimator(int, boolean, int)方法的整个文档包含以下文本:

“片段加载animation时调用。”

而已。 没有关于参数的解释。

参数是什么意思? 即使是源代码也没有透露太多。

onCreateAnimator方法很奇怪。 我见过的原型是这样的:

public Animator onCreateAnimator(int transit, boolean enter, int nextAnim)

如上所述,如上所述,过渡型过渡型

boolean enter – 如果’输入则为true,否则为false

int nextAnim即将播放的animation的资源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 (eg 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()函数的四个animationID之一,即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; } 

通过这种方式,您应该能够向片段转换animation师添加侦听器,就像您自己创建它们一样。

基于FragmentManager代码和FragmentManagerImpl.loadAnimator(android.app.Fragment,int,boolean,int)的用法,似乎Fragment.onCreateAnimator(int,boolean,int)允许您为片段隐藏,显示,更改状态定义自己的animation。 但是,我从未在真正的应用程序中看到它的用法。

关于参数:

  • int transit – 转换types(常量FragmentTransaction ,例如在这里使用 );
  • boolean enter – 如果状态为enter则为true,否则为false – 否则;
  • int transitionStyle – 来自资源的样式的id(该样式可能包含onCreateAnimator遗漏的animation);