2011-11-29 81 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()方法在它變爲可見時調用,然後開始動畫。