2014-10-04 4 views
5

Sto realizzando un'app flashcard kanji. Voglio avere un LinearLayout che rappresenta il fronte e un altro che rappresenta il retro della carta, entrambi ho dichiarato in un layout XML. Il problema è che il secondo LinearLayout è sempre invisibile, il primo si anima normalmente. Esiste comunque una chiamata al metodo mentre l'animazione è in corso? Voglio impostare la visibilità del primo layout su GONE e il secondo su VISIBLE?Attiva l'animazione del flip card tra due viste utilizzando AnimatorSet

Oppure c'è un altro modo migliore per implementare la carta ruotabile?

Di seguito è riportato il mio codice. Grazie in anticipo.

<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/card_container_layout" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical" 
    android:background="#ff825e4e" > 

     <LinearLayout 
      android:id="@+id/card_front_layout" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      android:layout_margin="10dp" 
      android:gravity="center" 
      android:background="@drawable/card_shape_front"> 
      <TextView 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:text="傘" 
       android:textColor="#ff000000" 
       android:textSize="200sp"/> 
     </LinearLayout> 

     <LinearLayout 
      android:id="@+id/card_back_layout" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      android:gravity="center" 
      android:layout_margin="10dp" 
      android:background="@drawable/card_shape_front"> 

      <TextView 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content" 
       android:layout_marginTop="16dp" 
       android:gravity="center" 
       android:text="QWERTY" 
       android:textColor="#ff000000"/> 
     </LinearLayout> 
</LinearLayout> 

FlashcardsFragment.java

public class FlashcardsFragment extends Fragment 
{ 
    private AnimatorSet showFrontAnim = new AnimatorSet(); 
    private AnimatorSet showBackAnim = new AnimatorSet(); 
    private boolean isShowingBack = false; 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
    { 
     View v = inflater.inflate(R.layout.fragment_flashcard, container, false); 

     LinearLayout cardFront = (LinearLayout) v.findViewById(R.id.card_front_layout); 
     LinearLayout cardBack = (LinearLayout) v.findViewById(R.id.card_back_layout); 

     // Load the animator sets from XML and group them together 

     AnimatorSet leftIn = (AnimatorSet) AnimatorInflater 
       .loadAnimator(getActivity(), R.animator.card_flip_left_in); 
     AnimatorSet rightOut = (AnimatorSet) AnimatorInflater 
       .loadAnimator(getActivity(), R.animator.card_flip_right_out); 
     AnimatorSet leftOut = (AnimatorSet) AnimatorInflater 
       .loadAnimator(getActivity(), R.animator.card_flip_left_out); 
     AnimatorSet rightIn = (AnimatorSet) AnimatorInflater 
       .loadAnimator(getActivity(), R.animator.card_flip_right_in); 

     leftIn.setTarget(cardFront); 
     rightOut.setTarget(cardBack); 
     showFrontAnim.playTogether(leftIn, rightOut); 

     leftOut.setTarget(cardFront); 
     rightIn.setTarget(cardBack); 
     showBackAnim.playTogether(leftOut, rightIn); 

     LinearLayout cardContainer = (LinearLayout) 
       v.findViewById(R.id.card_container_layout); 
     // Set the flip animation to be triggered on container clicking 
     cardContainer.setOnClickListener(new View.OnClickListener() 
     { 
      @Override 
      public void onClick(View v) 
      { 
       if (isShowingBack) { 
        showFrontAnim.start(); 
        isShowingBack = false; 
       } 
       else { 
        showBackAnim.start(); 
        isShowingBack = true; 
       } 
      } 
     }); 

     return v; 
    } 
} 

risposta

0

Si potrebbe utilizzare:

cardFront.setVisibility(View.VISIBLE); 
cardBack.setVisibility(View.GONE); 

questo cambierà la visibilità dei tuoi layout all'interno del codice in qualsiasi luogo che si desidera.

+0

Grazie, ma quello che voglio sapere è come inserire quelle chiamate mentre le viste si animano. – kradragon

+0

@kradragon Potresti provare a chiamarli dopo il metodo playTogether ... – tibuurcio

+0

Ciò non funzionerà perché l'animazione non è ancora stata avviata. Voglio cambiare vista a metà tempo di animazione. – kradragon

1

In AnimatorSet è possibile aggiungere un'animazione aggiuntiva per impostare l'alpha su 0 o 1. Utilizzare solo il metodo startdelay per impostare l'animazione lunga 1 ms nel mezzo della lunghezza totale di AnimationSet.

Se si vuole migliorare la vostra capovolgere ulteriormente esaminare l'AdapterViewFlipper :)

3

EDIT: Il mio problema è stato risolto, ho cambiato il layout contenitore per FrameLayout, in questo modo i due punti di vista possono sovrapporsi l'un l'altro. Grazie per tutto :))

Problemi correlati