2014-10-04 15 views
5

Tworzę aplikację słówek kanji. Chcę mieć LinearLayout reprezentujący przód i drugi reprezentujący tył karty, oba zadeklarowałem w jednym układzie XML. Problem jest, drugi LinearLayout jest zawsze niewidoczny, pierwszy animuje się normalnie. Czy jest mimo to wywołanie metody podczas animacji? Chcę ustawić widoczność pierwszego układu na GONE, a drugi na VISIBLE?Implementacja animacji klapki karty między dwoma widokami przy użyciu AnimatorSet

Czy istnieje inny lepszy sposób na wdrożenie karty typu flip?

Poniżej znajduje się mój kod. Z góry dziękuję.

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

Odpowiedz

0

Można użyć:

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

to zmieni widoczność swoich układów wewnątrz kodu w dowolnym miejscu chcesz.

+0

Dziękuję, ale chcę wiedzieć, jak wstawić te połączenia, gdy widoki są animowane. – kradragon

+0

@kradragon Możesz spróbować wywołać je po metodzie playTogether ... – tibuurcio

+0

To nie zadziała, ponieważ animacja jeszcze się nie rozpoczęła. Chcę zmienić widok w połowie czasu animacji. – kradragon

1

W swoim AnimatorSet możesz dodać dodatkową animację do ustawienia alfa na 0 lub 1. Użyj tylko metody startdelay, aby ustawić animację o długości 1 ms w środku całkowitej długości AnimationSet.

Jeśli chcesz poprawić swoje klapki dodatkowo zajrzeć do AdapterViewFlipper :)

3

EDIT: Mój problem został rozwiązany, zmieniłem układ kontenera do FrameLayout, w ten sposób dwa widoki mogą na siebie zachodzić. Dziękuję wszystkim :))

Powiązane problemy