2013-07-25 100 views
10

我有以下佈局片段:等待其他視圖動畫結束

<LinearLayout 
     android:id="@+id/tagContainer" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:animateLayoutChanges="true" > 

    </LinearLayout> 

    <TextView 
     android:id="@+id/commentLabel" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_below="@+id/tagContainer" /> 

正如你所看到的,animateLayoutChanges設置爲trueLinearLayout,所以當一個項目被添加到它,它以動畫加。這很好,但是移除存在問題。如果我刪除一個項目,動畫仍然播放良好,但下面的TextView會立即彈出,並且不會等待動畫完成。我怎樣才能做到這一點,甚至更好,使TextView動畫與LinearLayout動畫同步?

+0

你能告訴我們的動畫代碼,你如何動畫添加到視圖?必須有動畫偵聽器或LayoutTransformation偵聽器,它具有在動畫結束,動畫結束時通知您的事件。 –

+0

根本沒有動畫代碼。如果您指定此屬性,框架將爲項目添加/刪除添加默認淡入淡出動畫。 – WonderCsabo

回答

18

你可從視圖中LayoutTransition以下列方式:

mLinearLayout = findViewById(R.id.myLayout); 
LayoutTransition layoutTransition = mLinearLayout.getLayoutTransition(); 
layoutTransition.addTransitionListener(new TransitionListener(){ 

      @Override 
      public void endTransition(LayoutTransition arg0, ViewGroup arg1, 
        View arg2, int arg3) { 
       switch(arg2.getId()){ 
           //.... 
           } 
      } 

      @Override 
      public void startTransition(LayoutTransition transition, 
        ViewGroup container, View view, int transitionType) { 
       switch(view.getId()){ 
           //.... 
           } 

      }}); 
+0

謝謝!我如何告訴'TextView'保持原位並上升? (我明白我必須在這些回調中做到這一點,但我不知道如何做到這一點)。 – WonderCsabo

+0

使用回調參數可以區分什麼類型的轉換int轉換類型表示這些轉換(請參閱文檔轉換類型),您需要實現自己的邏輯,如if(view.getView()== R. id.myView && transitionType == LayoutTransition.DISAPPEARING){// 添加/刪除TextView的 }' 首先,登錄了在回調存在的和他們的論點事件的順序,看看他們是如何叫,然後試驗你的觀點。 :) –

+0

有沒有辦法獲得轉換的進度? –

0

這不是一個答案,但一個隨時可以使用的代碼片斷您可以嘗試檢查發生了什麼。

mContainer = (ViewGroup) v.findViewById(R.id.container); 
if (Build.VERSION.SDK_INT >= 11) { 
    mLayoutTransition = mContainer.getLayoutTransition(); 

    if (mLayoutTransition != null) { 
     mLayoutTransition.addTransitionListener(new LayoutTransition.TransitionListener() { 

      @Override 
      public void startTransition(LayoutTransition transition, ViewGroup container, View view, int transitionType) { 
       Log.d("\n\n startTransition: in "+container+" view "+view+" type "+ descr(transitionType)); 
      } 

      @Override 
      public void endTransition(LayoutTransition transition, ViewGroup container, View view, int transitionType) { 
       Log.d("\n\n endTransition: in "+container+" view "+view+" type "+ descr(transitionType)); 
      } 

      String descr(int transitionType) { 
       String[] m = new String[]{"CHANGE_APPEARING","CHANGE_DISAPPEARING","APPEARING","DISAPPEARING"}; 
       return "" + transitionType + ": " + m[transitionType&3] + " changing="+(transitionType&LayoutTransition.CHANGING); 
      } 
     }); 
    } 
} 

對於我來說,容器視圖是LinearLayout和感興趣的事件是:

public void endTransition(LayoutTransition transition, ViewGroup container, View view, int transitionType) { // UI thread 
    if (transitionType == LayoutTransition.DISAPPEARING) { 
     // start 2nd animation, it will be done while another view is moved 
    } 
}