1

我正在製作像應用程序一樣的flashcard,並且我一直在使用翻轉動畫進行摔跤。我將我的代碼放在了android的AnimationsDemo上,區別在於它是在一個片段內而不是一個活動中完成的。 它工作正常,並不完全像上述演示的預覽,但足夠體面。除了...改變方向後。 如果應用程序在橫向啓動,它可以在橫向上正常工作,但在肖像中會出現怪異現象,如果應用程序在縱向上啓動,它將以縱向模式工作,並在風景中變得怪異。Android翻轉動畫在方向轉換後閃爍

visualisation of the "freaking"

這是我的代碼(我脫脂顯然數據模型)

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

}

的parentfragment加載形式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(); 
     } 
    }); 

和適配器使用的是:

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

}

我也試圖創建動畫形成動畫對象,並添加到一個透明按鈕,並在進出和切換的可見性動畫視圖,結果是一樣的。

任何想法/建議將受到歡迎。

回答

0

事實證明,我的代碼中沒有什麼缺失,問題與仿真器有關。至少看起來這樣。我在2臺真實設備(1部手機/ 1臺平板電腦)上試了一下,問題沒有在它們上面顯示,所以可能是AVD缺陷或模擬方向變化的簡單缺點。