2011-11-29 37 views
1

我有一个动画,在第一次显示片段时正确启动。但是在方向更改后,它不会重新启动。动画是一个动画列表资源集,作为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(); 
} 

编辑:我忘了补充一点,动画是一个标签,这使得事情变得更加困难里面。不过,我已经找到了问题并将在下面添加答案。

回答

3

有两种情况需要被解决,基于标签的创建时间:

  1. 第一个选项卡中创建,二是它的活动被附加到Window
  2. 第一个活动是附加到窗口和第二个选项卡创建

如果选项卡是第一个显示或旋转期间出现情况一。情况二发生在用户切换到该选项卡时,因为它不是第一个。让我们来分别处理每个案例:

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

调用AnimationDrawable.start()它连接到窗口(即里面的onCreate()或之前的onResume( ))打破了动画。正如指出的Android docs

需要注意的是不能将活动的onCreate()方法中调用呼吁AnimationDrawable的start()方法是很重要的,因为AnimationDrawable尚未完全贴在车窗。如果您想要立即播放动画而不需要交互,那么您可能需要从Activity中的onWindowFocusChanged()方法调用该动画,这会在Android将窗口放到焦点上时调用。

碎片更难,但基本相同。我们在活动覆盖的方法,然后调用了该片段:

@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(); 
     } 
    } 
} 

然后在该片段中,实施startAnimation():

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

案例2:a)连接到橱窗内)创建选项卡

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

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

这就要求在同一startAnimation()方法,如案例1,但是因为这个片段已经连接到窗口,它可以在onResume()期间被调用。

摘要

AnimationDrawable.start()可以当该片段仅可见被调用。有时它在onResume()期间可见,并且动画可以在该点开始。其他时候,它在那个时候还不可见,然后重写的onWindowFocusChanged()方法在它变为可见时调用,然后开始动画。