片段事务动画完成后执行操作

Moo*_*oop 53 android android-animation android-fragments

我想在动画结束后设置按钮可见性.

这就是调用动画的原因:

android.support.v4.app.FragmentTransaction fAnimation = this.getActivity().getSupportFragmentManager().beginTransaction();
fAnimation.setCustomAnimations(android.R.anim.slide_in_left, R.anim.pull_out_to_left);
if (this.isVisible()) {
    fAnimation.hide(this);
    fAnimation.commit();
}

// code that will be executed when the fragment is gone (after the animation is over)
Run Code Online (Sandbox Code Playgroud)

有没有办法让听众知道我的片段何时消失?

mja*_*ama 63

@nmw在他的答案中实现的动画师在API级别11中添加,并且不能与Android支持库实现的片段一起使用.

要收听Fragment动画事件,我扩展了支持库的Fragment类并覆盖了onCreateAnimation,将自定义AnimationListener附加到返回的Animation对象:

public class MyFragment extends android.support.v4.app.Fragment {

    private static final String TAG = "MyFragment";

    @Override
    public Animation onCreateAnimation(int transit, boolean enter, int nextAnim) {

        Animation anim = AnimationUtils.loadAnimation(getActivity(), nextAnim);

        anim.setAnimationListener(new AnimationListener() {

            @Override
            public void onAnimationStart(Animation animation) {
                Log.d(TAG, "Animation started.");
                // additional functionality 
            }

            @Override
            public void onAnimationRepeat(Animation animation) {
                Log.d(TAG, "Animation repeating.");
                // additional functionality
            }

            @Override
            public void onAnimationEnd(Animation animation) {
                Log.d(TAG, "Animation ended.");
                // additional functionality
            }
        });

        return anim;
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 当enter为false时,不会调用侦听器,因为FragmentManagerImpl设置了自己的侦听器.用AnimationSet返回它返回工作. (8认同)
  • @Sheikh Aman只需创建一个新的AnimationSet,添加动画(设置了你的监听器)并返回该组.这只是允许FragmentManagerImpl设置另一个监听器而不覆盖自己的监听器. (7认同)
  • 这应该怎么样?我正在使用此代码,它会在返回原始屏幕并正确动画之前闪烁动画.我的代码是:`Animation anim = AnimationUtils.loadAnimation(getActivity(),nextAnim); AnimationSet animationWrapper = new AnimationSet(false); animationWrapper.addAnimation(阿尼姆); ...返回animationWrapper;` (3认同)

nmw*_*nmw 16

您需要子类化Fragment并覆盖onCreateAnimator,然后您可以从XML加载这些动画并将侦听器附加到它们.

例如

public class MyFragment extends Fragment
{
    @Override
    public Animator onCreateAnimator(int transit, boolean enter, int nextAnim)
    {
        final int animatorId = (enter) ? R.anim.in_anim : R.anim.out_anim;
        final Animator anim = AnimatorInflater.loadAnimator(getActivity(), animatorId);
        anim.addListener(new AnimatorListenerAdapter()
        {
            @Override
            public void onAnimationStart(Animator animation)
            {
                ...
            }

            @Override
            public void onAnimationEnd(Animator animation)
            {
               ...
            }
        });

        return anim;
   }    
Run Code Online (Sandbox Code Playgroud)


Mea*_*man 7

结合上面的答案是我成功使用支持库片段的示例.

只需扩展MenuFragment并设置监听器即可获得之后执行的回调.

public class MenuFragment extends Fragment {

private WeakReference<OnMenuClosedListener> onMenuClosedListener;

@Override
public Animation onCreateAnimation(int transit, boolean enter, int nextAnim) {
    Animation anim = null;
    if (enter) {
        anim = AnimationUtils.loadAnimation(getActivity(), R.anim.anim_slide_in_top);
    } else {
        anim = AnimationUtils.loadAnimation(getActivity(), R.anim.anim_menu_slide_out_top);
        anim.setAnimationListener(new AnimationListener() {
            @Override public void onAnimationStart(Animation animation) {
            }
            @Override public void onAnimationRepeat(Animation animation) {
            }
            @Override public void onAnimationEnd(Animation animation) {
                onMenuClosed();
            }
        });
    }

    // NOTE: the animation must be added to an animation set in order for the listener
    // to work on the exit animation
    AnimationSet animSet = new AnimationSet(true);
    animSet.addAnimation(anim);

    return animSet;
}

private void onMenuClosed() {
    if (this.onMenuClosedListener != null) {
        OnMenuClosedListener listener = this.onMenuClosedListener.get();
        if (listener != null) {
            listener.onMenuClosed();
        }
    }
}

public void setOnMenuClosedListener(OnMenuClosedListener listener) {
    this.onMenuClosedListener = new WeakReference<MenuFragment.OnMenuClosedListener>(listener);
}

/**
 * Callback for when the menu is closed.
 */
public static interface OnMenuClosedListener {

    public abstract void onMenuClosed();

}
Run Code Online (Sandbox Code Playgroud)

}