2013-07-25 8 views
10

Mam następujący fragment układ:Poczekaj na inny widok animacji koniec

<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" /> 

Jak widać, animateLayoutChanges jest ustawiony na true na LinearLayout, więc gdy element jest dodawany do niej, ona animuje dodawanie . To dobrze, ale są problemy z usunięciem. Jeśli usunę element, animacja nadal będzie dobrze działać, ale poniżej pojawi się TextView i nie czeka na zakończenie animacji. Jak mogę to osiągnąć, a nawet lepiej, dokonać synchronizacji animacji TextView z animacją ?

+0

Może pokażesz nam kod animacji i jak dodać animację do widzenia? Musi istnieć program nasłuchujący animację lub program nasłuchujący LayoutTransformation, który powiadamia użytkownika o zakończeniu, zakończeniu i zakończeniu animacji. –

+0

W ogóle nie ma kodu animacji. Jeśli ta właściwość zostanie określona, ​​struktura dodaje domyślną animację zanikania dla dodawania/usuwania elementów. – WonderCsabo

Odpowiedz

18

Można pobrać LayoutTransition z widoku w następujący sposób:

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

Dzięki! Jak mogę powiedzieć "TextView", aby pozostał na miejscu i iść w górę? (Rozumiem, że kończę, że muszę to zrobić w tych wywołań zwrotnych, ale nie wiem jak to zrobić). – WonderCsabo

+0

Używając argumentu callbacks można rozróżnić, jaki jest typ przejścia 'int transitionType' oznacza te przejścia (zobacz dokument dla typów przejść), musisz zaimplementować własną logikę, np. ' if (view.getView() == R. id.myView && transitionType == LayoutTransition.DISAPPEARING) { // dodaj/usuń TextView } ' Przede wszystkim Zaloguj kolejność zdarzeń, które występujących i ich argumenty w wywołania zwrotnego, i zobaczyć, jak są one zadzwoniłem, a następnie eksperymentowałem z twoimi poglądami. :) –

+0

Czy istnieje sposób, aby uzyskać postęp przejścia? –

0

To nie jest odpowiedź, ale gotowy do wykorzystania kod snippet że można spróbować sprawdzić, co się dzieje.

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

Dla mnie widok pojemnik jest LinearLayout a zdarzenie w okolicy jest:

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 
    } 
}