3

Я пытаюсь получить фрагмент, который нужно вставить и удалить из моей активности с помощью круговой анимации. Я нашел это демо-репо 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; 
    } 

Может ли кто-нибудь объяснить поведение, показанное на видео?

ответ

3

Я думаю, что основная проблема заключается в том, что совершение FragmentTransaction выполняется асинхронно. Если вы хотите немедленно выполнить использование getFragmentManager().executePendingTransactions().

+0

Да, это исправлено. Я нашел обходное решение, если по какой-то причине это решение не работает для других: я сделал родительский макет фрагмента невидимым сразу после окончания анимации и до того, как я удалил фрагмент. Вид взлома, но и работает. Это было бы лучшим решением. Благодаря! – Urban

Смежные вопросы