2016-12-13 6 views
1

Итак, мы пытаемся сделать анимацию, которая перемещает FAB до ее исчезновения и открывает панель инструментов. Проблема в том, что когда я запускаю TranslationAnimation, FAB исчезает, а затем переходит с экрана. fromxDelta и fromYDelta никогда не ведут себя так, как я их ожидаю.Перевод анимации начинается с экрана вместо того, где он принадлежит

Может ли кто-нибудь указать, что я делаю неправильно, или помочь мне понять, как работает этот звонок?

private void circularReveal(View toolbar, View fab) { 
    final View view1 = toolbar; 

    // get the center for the clipping circle 
    int cx = (toolbar.getLeft() + toolbar.getRight())/2; 
    int cy = (toolbar.getTop() + toolbar.getBottom())/2; 

    // get the final radius for the clipping circle 
    int finalRadius = Math.max(toolbar.getWidth(), toolbar.getHeight()); 

    // create the animator for this view (the start radius is zero) 
    final SupportAnimator anim = ViewAnimationUtils.createCircularReveal(toolbar, cx, cy, 0, finalRadius); 
    //todo create an animation to move the fab. 

    TranslateAnimation translateAnimation = new TranslateAnimation(Animation.ABSOLUTE, 0f, 
                   Animation.ABSOLUTE , -100f, 
                   Animation.ABSOLUTE , 0f, 
                   Animation.ABSOLUTE , -100f); 
    translateAnimation.setDuration(2000L); 
    translateAnimation.setFillAfter(true); 
    Animation.AnimationListener animationListener = new Animation.AnimationListener() { 

     @Override 
     public void onAnimationStart(Animation animation) { 

     } 

     @Override 
     public void onAnimationEnd(Animation animation) { 
      view1.setVisibility(View.VISIBLE); 
      anim.start(); 
     } 

     @Override 
     public void onAnimationRepeat(Animation animation) { 

     } 
    }; 
    translateAnimation.setAnimationListener(animationListener); 
    fab.startAnimation(translateAnimation); 
} 

EDIT Я очистил некоторые имена переменных в фрагменте кода.

+0

как вы называете этот метод? roundReveal (fab, панель инструментов); ? Потому что вы применяете translateAnimation в своем представлении, который называется панелью инструментов. –

+0

Метод вызывается из onClickListener, который устанавливается на Fab в фрагментах onCreatView(). –

ответ

1

Итак, мы пытаемся сделать анимацию, которая перемещает FAB до этого исчезает и открывает панель инструментов.

Ваш код читается наоборот. Похоже, вы применяете TranslateAnimation в своем представлении под названием «панель инструментов» и используете круговой показ на вашем FloatingActionButton.

В любом случае я думаю, что вы пытаетесь достичь что-то вроде этого:

private void circularReveal(final View view, View toolbar) { 

    // get the center for the clipping circle 
    int cx = (toolbar.getLeft() + toolbar.getRight())/2; 
    int cy = (toolbar.getTop() + toolbar.getBottom())/2; 

    // get the final radius for the clipping circle 
    int finalRadius = Math.max(toolbar.getWidth(), toolbar.getHeight()); 

    // create the animator for this view (the start radius is zero) 
    final Animator anim = ViewAnimationUtils.createCircularReveal(toolbar, cx, cy, 0, finalRadius); 

    view.animate() 
      .translationX(-100) 
      .translationY(-100) 
      .setDuration(2000) 
      .setListener(new Animator.AnimatorListener() { 
       @Override 
       public void onAnimationStart(Animator animation) { 

       } 

       @Override 
       public void onAnimationEnd(Animator animation) { 
        view.setVisibility(View.INVISIBLE); // set this to INVISIBLE if you want your FAB to dissapear 
        anim.start(); 
       } 

       @Override 
       public void onAnimationCancel(Animator animation) { 

       } 

       @Override 
       public void onAnimationRepeat(Animator animation) { 

       } 
      }); 

} 

Это перемещает FAB немного влево и вверх, прежде чем панель показывает и FAB пропадает.

Вызовите этот метод с помощью FAB как первый, а ToolBar - вторым параметром.

Я упустил TranslateAnimation и использовал ViewPropertyAnimator, потому что TranslateAnimation не действительно перемещает вид, а только пиксели на экране, в то время как ViewPropertyAnimator изменяет фактическое позиционирование представления. Проблема с TranslateAnimation заключается в том, что вы все равно можете щелкнуть по старой позиции, где находился FAB, и он все равно будет запускать FAB OnClickListener.

+0

Спасибо, я очистил эти имена переменных. Я попробовал ViewPropertyAnimator, как в вашем примере, и это заставило fab исчезнуть с экрана, чтобы снова появиться в новом месте после двух секунд. –

+0

Итак, мне пришлось установить атрибут android: animateLayoutChanges = "true" в двух родителях xml моего фрагмента xml. как только я сделал это, анимация появилась правильно. Спасибо за вашу помощь. –