片段中的动画在旋转后不会重新启动

时间:2011-11-29 21:37:23

标签: android rotation android-animation

我有一个动画,它在第一次显示片段时正确启动。但是在方向更改后,它将不会重新启动。动画是动画列表资源,设置为ImageView的背景。

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    final View root = inflater.inflate(R.layout.fragment_lead_manual,
            container, false);
    final ImageView badgeEntryView = (ImageView) root
            .findViewById(R.id.manual_image);
    mAnimation = (AnimationDrawable) badgeEntryView.getBackground();
    return root;
}

@Override
public void onResume() {
    super.onResume();
    mAnimation.start();
}

@Override
public void onPause() {
    super.onPause();
    mAnimation.stop();
}

编辑:我忘了添加动画在标签内,这让事情变得更加困难。但是,我已经找到了问题并将在下面添加答案。

1 个答案:

答案 0 :(得分:3)

根据创建标签的时间,有两种情况需要解决:

  1. 首先创建选项卡,并将SECOND的活动附加到窗口
  2. 首先将活动附加到窗口,然后创建第二个选项卡
  3. 如果选项卡是显示的第一个选项卡或在旋转期间,则会出现第一种情况。当用户切换到该选项卡时,会出现案例二,因为它不是第一个。让我们分别处理每个案例:

    案例1:a)创建标签b)附加到窗口

    在将AnimationDrawable.start()附加到窗口之前调用它(即在onCreate()或onResume()内部)会中断动画。如Android docs中所述:

      

    重要的是要注意,在Activity的onCreate()方法中,无法调用在AnimationDrawable上调用的start()方法,因为AnimationDrawable尚未完全附加到窗口。如果你想立即播放动画而不需要交互,那么你可能想从你的Activity中的onWindowFocusChanged()方法调用它,当Android让你的窗口成为焦点时会调用它。

    碎片更难,但基本相同。我们覆盖Activity中的方法,然后调用Fragment:

    @Override
    public void onWindowFocusChanged(boolean hasFocus) {
        super.onWindowFocusChanged(hasFocus);
        if (hasFocus) {
            final FragmentManager fm = getFragmentManager();
            ManualLeadFragment manualFragment = (ManualLeadFragment) fm
                    .findFragmentByTag(TAG_MANUAL);
            if (manualFragment != null) {
                manualFragment.startAnimation();
            }
        }
    }
    

    然后在Fragment中,实现startAnimation():

    void startAnimation() {
        mAnimation.start();
    }
    

    案例2:a)附加到窗口b)创建标签

    在这种情况下,已经发生了对onWindowFocusChanged()的调用,因此动画将无法启动。所以我们仍然需要在onResume()期间启动它,但略有不同:

    @Override
    public void onResume() {
        super.onResume();
        if (isVisible()) {
            startAnimation();
        }
    }
    

    这会调用与情况1相同的startAnimation()方法,但由于Fragment已经附加到Window,因此可以在onResume()期间调用它。

    <强>摘要

    只有在片段可见时才能调用AnimationDrawable.start()。有时它在onResume()期间可见,并且可以在该点开始动画。其他时候它当时还不可见,然后在它变得可见时调用onWindowFocusChanged()方法,然后启动动画。