Я пытаюсь получить фрагмент, который нужно вставить и удалить из моей активности с помощью круговой анимации. Я нашел это демо-репо here, которое делает именно это. Единственное изменение, которое я сделал, это удаление фрагмента нажатием кнопки, а не фрагмент, затронутый слушателем.Фрагмент вспышки после удаления и окончания анимации
Проблема заключается в том, что после удаления с помощью кнопки, когда анимация заканчивается, я вижу фрагмент flash на секунду. Вспышка не случается, если я удаление фрагмента с помощью onTouch слушателя: YouTube link
Несколько наблюдений:
- Если я запускаю код на мобильном устройстве, то вспышка происходит только, если я удаление фрагмента используя кнопку. При вызове функции onFragmentTouch не происходит ни одной вспышки.
- Если я запускаю это на эмуляторе, тогда я вижу, как он вспыхивает на обоих, нажатие кнопки и касание фрагмента.
Чтобы упростить процесс, мой слушатель onFragmentTouch просто вызывает функцию remove
, которая фактически удаляет фрагмент. Эта же функция также вызывается кнопкой в ее XML. Я не могу понять, почему это происходит. Код для справки.
Добавить фрагмент, в основной деятельности:
public void addFragment(View v)
{
int randomColor =
Color.argb(255, (int)(Math.random() * 255), (int)(Math.random() * 255), (int)(Math.random() * 255));
mfragment = CircularRevealingFragment.newInstance(20, 20, randomColor);
getFragmentManager().beginTransaction().add(R.id.container, mfragment).commit();
}
Функция для удаления фрагмента, а также в рамках основной деятельности:
public void remove(View v){
Animator unreveal = mfragment.prepareUnrevealAnimator(0, 0);
unreveal.addListener(new Animator.AnimatorListener()
{
@Override
public void onAnimationEnd(Animator animation)
{
getFragmentManager().beginTransaction().remove(mfragment).commit();
}
//hiding other overridden function.
});
unreveal.start();
}
CircularRevealingFragment довольно просто, с главным все такое же, как в том, что проект github. Необратимый аниматор:
public Animator prepareUnrevealAnimator(float cx, float cy)
{
int radius = getEnclosingCircleRadius(getView(), (int)cx, (int)cy);
Animator anim = ViewAnimationUtils.createCircularReveal(getView(), (int) cx, (int) cy, radius, 0);
anim.setInterpolator(new AccelerateInterpolator(2f));
anim.setDuration(1000);
return anim;
}
Может ли кто-нибудь объяснить поведение, показанное на видео?
Да, это исправлено. Я нашел обходное решение, если по какой-то причине это решение не работает для других: я сделал родительский макет фрагмента невидимым сразу после окончания анимации и до того, как я удалил фрагмент. Вид взлома, но и работает. Это было бы лучшим решением. Благодаря! – Urban