2016-12-13 3 views
1

Wir versuchen also, eine Animation zu erstellen, die den FAB bewegt, bevor er verschwindet und eine Symbolleiste öffnet. Das Problem ist, wenn ich die TranslationAnimation ausführe, verschwindet die FAB und schiebt sich dann vom Bildschirm weg. die von xDelta und von YDelta verhalten sich nicht so, wie ich sie auch erwarte.Die Translationsanimation beginnt nicht am Bildschirm, sondern am Bildschirm

Kann jemand darauf hinweisen, was ich falsch mache oder mir helfen zu verstehen, wie dieser Anruf funktioniert?

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 reinigte ich im Code-Schnipsel einige Variablennamen auf.

+0

Wie nennt man diese Methode? circularReveal (fab, toolbar); ? Weil Sie die translateAnimation in Ihrer Ansicht mit der benannten Symbolleiste anwenden. –

+0

Die Methode wird vom OnClickListener aufgerufen, der in den Fragmenten onCreatView() auf dem Fab gesetzt wird. –

Antwort

1

Also versuchen wir eine Animation zu machen, die den FAB bewegt bevor er verschwindet und eine Werkzeugleiste öffnet.

Ihr Code liest umgekehrt. Es sieht so aus, als ob Sie eine TranslateAnimation in Ihrer Ansicht namens 'toolbar' anwenden und eine kreisförmige Anzeige in Ihrem FloatingActionButton verwenden.

Sowieso denke ich Sie, so etwas zu erreichen versuchen:

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) { 

       } 
      }); 

} 

Das die FAB ein wenig nach links bewegt und bevor die Symbolleiste zeigt und die FAB verschwindet.

Rufen Sie diese Methode mit FAB als ersten und ToolBar als zweiten Parameter auf.

Ich habe die TranslateAnimation weggelassen und ViewPropertyAnimator verwendet, weil eine TranslateAnimation nicht wirklich die Ansicht, sondern nur die Pixel auf dem Bildschirm bewegt, während ViewPropertyAnimator die tatsächliche Positionierung der Ansicht ändert. Das Problem mit TranslateAnimation besteht darin, dass Sie immer noch auf die alte Position klicken können, an der sich der FAB befand, und es wird weiterhin den FAB OnClickListener auslösen.

+0

Danke Ich habe diese Variablennamen aufgeräumt. Ich habe den ViewPropertyAnimator wie in Ihrem Beispiel ausprobiert und die Fab vom Bildschirm verschwinden lassen, nur um nach zwei Sekunden wieder an der neuen Stelle zu erscheinen. –

+0

Also musste ich das Attribut android: animateLayoutChanges = "true" in den beiden XML-Eltern meines Fragmentlayouts xml setzen. Sobald ich das gemacht habe, erschien die Animation korrekt. Danke für Ihre Hilfe. –

Verwandte Themen