JavaFX - Animation de rebond (bounce animation)

DĂ©pendances Maven JavaFX

<dependency>
   <groupId>org.openjfx</groupId>
   <artifactId>javafx-controls</artifactId>
   <version>18</version>
</dependency>

Java TranslateTransition et ScaleTransition

package fr.ronanlefichant.animation;

import javafx.animation.ScaleTransition;
import javafx.animation.TranslateTransition;
import javafx.application.Application;
import javafx.scene.Node;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;
import javafx.util.Duration;

/**
 * JavaFX App
 */
public class App extends Application {

  public static void main(String[] args) {
    launch();
  }

  @Override
  public void start(Stage stage) {

    Label label = new Label("Animation");
    label.setStyle("-fx-font-size: 48");
    BounceUpAnimation bounceAnimation = new BounceUpAnimation(label);

    Scene scene = new Scene(new StackPane(label), 640, 480);
    stage.setScene(scene);

    // Quand la fenĂȘtre est affichĂ©e
    stage.setOnShown(event -> {
      bounceAnimation.play();
    });

    stage.show();

  }

  class BounceUpAnimation {

    private Node node;
    private TranslateTransition firstBounce;
    private ScaleTransition firstScaleBounce;

    /**
     * Animation rebond
     * 
     * @param node Le noeud Ă  animer
     */
    public BounceUpAnimation(Node node) {
      this.node = node;
      initAnimation();
    }

    /**
     * Création de l'animation
     */
    private void initAnimation() {
      // Le premier rebond de -50 (vers le haut)
      firstBounce = createBounce(-50);
      // Lors du premier rebond le noeud s'agrandit
      firstScaleBounce = createScaleBounce(0.5);

      // Le second rebond de -30 (moins haut que le premier rebond)
      TranslateTransition secondBounce = createBounce(-30);
      // Lors du premier rebond le noeud s'agrandit 0.25
      ScaleTransition secondScaleBounce = createScaleBounce(0.25);

      // Quand le premier rebond est terminé
      firstBounce.setOnFinished(event -> {
        // Joue le deuxiĂšme rebond
        secondBounce.play();
        secondScaleBounce.play();
      });
    }

    /**
     * @param value Valeur du rebond pour le noeud - Un nombre négatif correspond à
     *              un mouvement vers le haut
     * @return La Transition
     */
    private TranslateTransition createBounce(double value) {
      TranslateTransition translateTransition = new TranslateTransition();
      translateTransition.setDuration(Duration.millis(300));
      translateTransition.setNode(node);
      translateTransition.setByY(value);
      translateTransition.setAutoReverse(true);
      translateTransition.setCycleCount(2);
      return translateTransition;
    }

    /**
     * @param value Valeur d'agrandissement pour le noeud - Un nombre positif
     *              correspond Ă  un agrandissement
     * @return
     */
    private ScaleTransition createScaleBounce(double value) {
      ScaleTransition scaleTransition = new ScaleTransition();
      scaleTransition.setDuration(Duration.millis(300));
      scaleTransition.setNode(node);
      scaleTransition.setByY(value);
      scaleTransition.setAutoReverse(true);
      scaleTransition.setCycleCount(2);
      return scaleTransition;
    }

    /**
     * Joue l'animation
     */
    public void play() {
      firstBounce.play();
      firstScaleBounce.play();
    }

  }

}

Commentaires