1

Je travaille sur une application semblable à une carte flash et je me suis battue avec l'animation flip. J'ai basé mon code sur le AnimationsDemo d'Android avec la différence étant qu'il est fait à l'intérieur d'un fragment au lieu d'une activité. Cela fonctionne bien, pas tout à fait comme l'aperçu de la démo ci-dessus, mais assez décent. Sauf ... après avoir changé d'orientation. Si l'application est démarrée en mode paysage, elle fonctionne très bien en mode paysage, mais elle freaks en mode portrait et si l'application est lancée en mode portrait, elle fonctionne en mode portrait et freaks en mode paysage.L'animation de flip Android clignote après le changement d'orientation

visualisation of the "freaking"

Ceci est mon code (i effleuré le datamodel évidemment)

public class MyFlashCardFragment extends Fragment { 
private MyDataModel model; 
private Handler mHandler = new Handler(); 
private boolean mShowingBack = false; 
FrameLayout frameLayout; 

public static MyFlashCardFragment create(MyDataModel m) { 
    MyFlashCardFragment fragment = new MyFlashCardFragment(); 
    Bundle bundle = new Bundle(); 
    bundle.putString(AppKeys.FRONT_KEY,m.getFrontText()); 
    bundle.putString(AppKeys.BACK_KEY,m.getBackText()); 
    fragment.setArguments(bundle); 
    return fragment; 
} 

@Override 
public void onCreate(@Nullable Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    if (!getArguments().isEmpty()) { 
     model = new MyDataModel(); 
     model.setFrontText(getArguments().getString(AppKeys.FRONT_KEY)); 
     model.setBackText(getArguments().getString(AppKeys.BACK_KEY)); 
    } 
} 

@Nullable 
@Override 
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) { 
    if (model == null) { 
     return super.onCreateView(inflater, container, savedInstanceState); 
    } else { 
     ViewGroup root = (ViewGroup) inflater.inflate(R.layout.fragment_flashcard, container, false); 
     frameLayout = (FrameLayout) root.findViewById(R.id.chilfd_frame); 
     Button btn_overlay = (Button) root.findViewById(R.id.overlaybutton); 
     btn_overlay.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       flipCard(); 
      } 
     }); 

     return root; 
    } 
} 

@Override 
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { 
    super.onViewCreated(view, savedInstanceState); 
    if(savedInstanceState == null) { 
     getChildFragmentManager() 
       .beginTransaction() 
       .add(R.id.chilfd_frame, CardFrontFragment.create(model.getFrontText())) 
       .commit(); 
    } else { 
     mShowingBack = (getChildFragmentManager().getBackStackEntryCount() > 0); 
    } 
    getChildFragmentManager().addOnBackStackChangedListener(new android.app.FragmentManager.OnBackStackChangedListener() { 
     @Override 
     public void onBackStackChanged() { 
      mShowingBack = (getChildFragmentManager().getBackStackEntryCount() > 0); 
      getActivity().invalidateOptionsMenu(); 
     } 
    }); 
} 

private void flipCard() { 
    if (mShowingBack) { 
     getChildFragmentManager().popBackStack(); 
     return; 
    } 

    mShowingBack = true; 

    getChildFragmentManager() 
      .beginTransaction() 
      .setCustomAnimations(
        R.animator.card_flip_right_in, R.animator.card_flip_right_out, 
        R.animator.card_flip_left_in, R.animator.card_flip_left_out) 
      .replace(frameLayout.getId(), CardBackFragment.create(model.getBackText())) 
      .addToBackStack(null) 
      .commit(); 
    mHandler.post(new Runnable() { 
     @Override 
     public void run() { 
      getActivity().invalidateOptionsMenu(); 
     } 
    }); 
} 


/** 
* A fragment representing the front of the card. 
*/ 
public static class CardFrontFragment extends Fragment { 
    String frontText; 

    public static CardFrontFragment create(String frontText) { 
     CardFrontFragment fragment = new CardFrontFragment(); 
     Bundle bundle = new Bundle(); 
     bundle.putString(AppKeys.FRONT_KEY,frontText); 
     fragment.setArguments(bundle); 
     return fragment; 
    } 

    @Override 
    public void onCreate(@Nullable Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     if (!getArguments().isEmpty()) { 
      frontText = getArguments().getString(AppKeys.FRONT_KEY); 
     } 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     if (TextUtils.isEmpty(frontText)) { 
      return super.onCreateView(inflater, container, savedInstanceState); 
     } else { 
      ViewGroup rootView = (ViewGroup) inflater.inflate(R.layout.fragment_flashcard_front, container, false); 

      ((TextView) rootView.findViewById(R.id.tv_name)).setText(frontText); 


      return rootView; 
     } 
    } 
} 

/** 
* A fragment representing the back of the card. 
*/ 
public static class CardBackFragment extends Fragment { 
    String backText; 

    public static CardBackFragment create(String backText) { 
     CardBackFragment fragment = new CardBackFragment(); 
     Bundle bundle = new Bundle(); 
     bundle.putString(AppKeys.BACK_KEY,backText); 
     fragment.setArguments(bundle); 
     return fragment; 
    } 

    @Override 
    public void onCreate(@Nullable Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     if (!getArguments().isEmpty()) { 
      backText = getArguments().getString(AppKeys.BACK_KEY); 
     } 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     if (TextUtils.isEmpty(backText)) { 
      return super.onCreateView(inflater, container, savedInstanceState); 
     } else { 
      ViewGroup rootView = (ViewGroup) inflater.inflate(R.layout.fragment_flashcard_back, container, false); 

      ((TextView) rootView.findViewById(R.id.tv_name)).setText(backText); 


      return rootView; 
     } 
    } 
} 

}

Le parentfragment est sous forme chargée une viewpager:

pager = (ViewPager) findViewById(R.id.pager); 
    adapter = new FlashCardPageAdapter(getFragmentManager(), getAllFrom(ref)); 
    pager.setAdapter(adapter); 
    pager.setCurrentItem(position,true); 

    pager.addOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() { 
     @Override 
     public void onPageSelected(int position) { 
      invalidateOptionsMenu(); 
     } 
    }); 

et l'adaptateur utilisé est:

public class FlashCardPageAdapter extends FragmentStatePagerAdapter { 
private ArrayList<MyDataModel> Models; 

public FlashCardPageAdapter(FragmentManager fm, ArrayList<MyDataModel> list) { 
    super(fm); 
    this.Models = list; 
} 

@Override 
public Fragment getItem(int position) { 
    return FlashCardFragment.create(Models.get(position)); 
} 

@Override 
public int getCount() { 
    return Models.size(); 
} 

}

J'ai aussi essayé de créer les animations forment un objet Animator et l'ajouter à un bouton transparent et animant des vues à l'intérieur et sur la visibilité et BASCULEMENT et le résultat est le même.

Toutes idées/suggestions seraient les bienvenues.

Répondre

0

Il s'avère qu'il n'y a rien qui manque dans mon code et le problème est lié à l'émulateur. Eh bien, au moins, il semble que ce soit le cas. Je l'ai essayé sur 2 vrais appareils (1 téléphone/1 tablette) et le problème ne s'est pas manifesté sur eux, donc peut-être un bug AVD ou un simple défaut du changement d'orientation simulé.