簡體   English   中英

方向更改后,Android翻轉動畫會閃爍

[英]Android flip animation flashes after orientation change

我正在使用像app這樣的閃卡,我一直在和翻轉動畫進行摔跤。 我將我的代碼基於Android上的AnimationsDemo ,不同之處在於它是在片段而不是活動中完成的。 它工作正常,不完全像上述演示的預覽,但足夠體面。 改變方向后...... 如果應用程序是在風景中啟動的,它在風景中工作得很好,但是在肖像方面很怪異,如果應用程序是以肖像方式啟動的,那么它可以在縱向和怪異的環境中工作。

可視化的“怪胎”

這是我的代碼(我明顯地略去了數據模型)

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

}

我還嘗試從Animator對象創建動畫,並將其添加到透明按鈕,進出動畫視圖並切換可見性,結果是相同的。

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

事實證明我的代碼中沒有任何遺漏,問題與模擬器有關。 好吧,至少看起來那樣。 我在2個真實設備(1個電話/ 1個平板電腦)上嘗試過它並且問題沒有在它們上面顯示,因此可能是AVD錯誤或模擬方向改變的簡單缺點。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM