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

Fragment.onCreateAnimator(int, boolean, int)方法的整个文档由以下文本组成:

“片段加载animation时调用”。

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

这些参数是什么意思? 甚至源代码也不会透露太多。

Solutions Collecting From Web of "Fragment.onCreateAnimator()的文档在哪里?"

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

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

int transit – 过渡types,正如桑斯塔尔所说的那样

boolean enter – 如果input,则为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是包含您要replace的现有片段的ViewGroup的ID。

当上面的代码被执行时, onCreateAnimator方法将被调用, nextAnim参数将是传递给setCustomAnimations()函数的四个animationID之一,即R.animator.card_flip_right_in,R.animator.card_flip_right_out …等。

这一开始看起来并不是很有用,因为它不会给你一个可以附加一个监听器的实际Animator对象的引用。 但奇怪的是,您可以直接从nextAnim资源中直接膨胀另一个Animator,然后将侦听器附加到该侦听器上,奇怪的是,它会在正确的时间触发所有重写的callback:

 @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师,就像您自己创build了侦听器一样。

基于FragmentManager代码和FragmentManagerImpl.loadAnimator(android.app.Fragment,int,boolean,int)的用法,似乎Fragment.onCreateAnimator(int,boolean,int)可以让你为片段隐藏,显示,改变状态定义自己的animation。 但是,我从来没有见过在真正的应用程序中使用它。

关于参数:

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