2016-03-12 2 views
1

Я использую this libary для создания CircularReveal анимации на устройствах pre-Lollipop. Проблема заключается в скрытии View с анимацией. Анимация выполняется также, но после окончания анимации View становится видимым на секунду, а затем исчезает. Как я могу предотвратить мигание View?Android CircularReveal library Просмотр ошибки видимости

Вот мой метод для сокрытия View с CircularReveal анимации:

public static void revealCloseTopRight(final View view) { 
      int cx = view.getRight(); 
      int cy = view.getTop(); 

      // get the final radius for the clipping circle 
      int dx = Math.max(cx, view.getWidth() - cx); 
      int dy = Math.max(cy, view.getHeight() - cy); 
      float finalRadius = (float) Math.hypot(dx, dy); 

      SupportAnimator animator = ViewAnimationUtils.createCircularReveal(view, cx, cy, 0, finalRadius); 
      animator.setInterpolator(new AccelerateDecelerateInterpolator()); 
      animator.setDuration(animDuration); 
      animator = animator.reverse(); 

      try { 
       animator.start(); 
      } catch (Exception ex) { 
       ex.printStackTrace(); 
      } 

      view.postDelayed(new Runnable() { 
       @Override 
       public void run() { 
        view.setVisibility(View.INVISIBLE); 
       } 
      }, animDuration); 
     } 

UPDATE

Я также попытался добавить SupportAnimator.AnimatorListener() так:

animator.addListener(new SupportAnimator.AnimatorListener() { 
       @Override 
       public void onAnimationStart() { 
        Log.d(AnimationSupport.TAG, TAG + " -> 1onAnimationStart()"); 

       } 

       @Override 
       public void onAnimationEnd() { 
        Log.d(AnimationSupport.TAG, TAG + " -> 1onAnimationEnd()"); 
        view.setVisibility(View.INVISIBLE); 
       } 

       @Override 
       public void onAnimationCancel() { 
        Log.d(AnimationSupport.TAG, TAG + " -> 1onAnimationCancel()"); 

       } 

       @Override 
       public void onAnimationRepeat() { 
        Log.d(AnimationSupport.TAG, TAG + " -> 1onAnimationRepeat()"); 

       } 
      }); 

И Animator.AnimatorListener() как это:

animator.addListener(new Animator.AnimatorListener() { 
       @Override 
       public void onAnimationStart(Animator animation) { 
        Log.d(AnimationSupport.TAG, TAG + " -> onAnimationStart()"); 

       } 

       @Override 
       public void onAnimationEnd(Animator animation) { 
        Log.d(AnimationSupport.TAG, TAG + " -> onAnimationEnd()"); 
        view.setVisibility(View.INVISIBLE); 
       } 

       @Override 
       public void onAnimationCancel(Animator animation) { 
        Log.d(AnimationSupport.TAG, TAG + " -> onAnimationCancel()"); 

       } 

       @Override 
       public void onAnimationRepeat(Animator animation) { 
        Log.d(AnimationSupport.TAG, TAG + " -> onAnimationRepeat()"); 

       } 
      }); 

В обоих случаях ни один из этих обратных вызовов никогда не вызывается. Понятия не имею почему.

ответ

0

Вид виден, потому что между завершением анимации и исполнением вашего обработчика очень небольшая задержка.

Вы можете решить эту проблему, добавив прослушиватель анимации в свою круговую анимацию раскрытия и установив вид невидимым в обратном вызове onAnimationEnd().

+0

Я пытался это сделать. Проблема в том, что 'onAnimationEnd()' никогда не вызывается, и я понятия не имею, почему. Итак, я решил использовать 'postDelayed()', и теперь я моргаю 'View' –