Note that there are some explanatory texts on larger screens.

plurals
  1. PO
    text
    copied!<p>This is a conversion of parts of old sun JavaFX 1 ripple generator to JavaFX 2.</p> <p><img src="https://i.stack.imgur.com/5FzgV.png" alt="ripples"></p> <p>It's not the most realistic water ripple effect, but maybe it's enough to get you started creating your own. You could add in a <a href="http://docs.oracle.com/javafx/2/api/javafx/scene/effect/DisplacementMap.html" rel="nofollow noreferrer">DisplacementMap</a> effect to distort your image as a result of the "waves".</p> <p>The code uses JavaFX animation timelines to generate expanding concentric circles that gradually fade away of time.</p> <pre><code>import javafx.animation.*; import javafx.application.Application; import static javafx.application.Application.launch; import javafx.collections.*; import javafx.event.*; import javafx.scene.*; import javafx.scene.input.MouseEvent; import javafx.scene.paint.*; import javafx.scene.shape.Circle; import javafx.stage.*; import javafx.util.Duration; public class FishSim extends Application { private static final Paint SCENE_FILL = new RadialGradient( 0, 0, 300, 300, 500, false, CycleMethod.NO_CYCLE, FXCollections.observableArrayList(new Stop(0, Color.BLACK), new Stop(1, Color.BLUE)) ); @Override public void start(Stage stage) { final RippleGenerator rippler = new RippleGenerator(); final Scene scene = new Scene(rippler, 600, 400, SCENE_FILL); scene.setOnMousePressed(new EventHandler&lt;MouseEvent&gt;() { @Override public void handle(MouseEvent event) { rippler.setGeneratorCenterX(event.getSceneX()); rippler.setGeneratorCenterY(event.getSceneY()); rippler.createRipple(); rippler.startGenerating(); } }); scene.setOnMouseDragged(new EventHandler&lt;MouseEvent&gt;() { @Override public void handle(MouseEvent event) { rippler.setGeneratorCenterX(event.getSceneX()); rippler.setGeneratorCenterY(event.getSceneY()); } }); scene.setOnMouseReleased(new EventHandler&lt;MouseEvent&gt;() { @Override public void handle(MouseEvent event) { rippler.stopGenerating(); } }); stage.setTitle("Click, hold mouse button down and move around to create ripples"); stage.setScene(scene); stage.setResizable(false); stage.show(); } public static void main(String[] args) { launch(args); } } /** * Generates ripples on the screen every 0.5 seconds or whenever * the createRipple method is called. Ripples grow and fade out * over 3 seconds */ class RippleGenerator extends Group { private class Ripple extends Circle { Timeline animation = new Timeline( new KeyFrame(Duration.ZERO, new KeyValue(radiusProperty(), 0)), new KeyFrame(Duration.seconds(1), new KeyValue(opacityProperty(), 1)), new KeyFrame(Duration.seconds(3), new KeyValue(radiusProperty(), 100)), new KeyFrame(Duration.seconds(3), new KeyValue(opacityProperty(), 0)) ); private Ripple(double centerX, double centerY) { super(centerX, centerY, 0, null); setStroke(Color.rgb(200, 200, 255)); } } private double generatorCenterX = 100.0; private double generatorCenterY = 100.0; private Timeline generate = new Timeline( new KeyFrame(Duration.seconds(0.5), new EventHandler&lt;ActionEvent&gt;() { @Override public void handle(ActionEvent event) { createRipple(); } } ) ); public RippleGenerator() { generate.setCycleCount(Timeline.INDEFINITE); } public void createRipple() { final Ripple ripple = new Ripple(generatorCenterX, generatorCenterY); getChildren().add(ripple); ripple.animation.play(); Timeline remover = new Timeline( new KeyFrame(Duration.seconds(3), new EventHandler&lt;ActionEvent&gt;() { @Override public void handle(ActionEvent event) { getChildren().remove(ripple); ripple.animation.stop(); } }) ); remover.play(); } public void startGenerating() { generate.play(); } public void stopGenerating() { generate.stop(); } public void setGeneratorCenterX(double generatorCenterX) { this.generatorCenterX = generatorCenterX; } public void setGeneratorCenterY(double generatorCenterY) { this.generatorCenterY = generatorCenterY; } } </code></pre> <p>The original JavaFX 1 fish simulator code that the conversion is based on came from <a href="http://subversion.jfrog.org/jfrog/greenhouse/javafx/fishsim/trunk/src/main/javafx/fishsim/" rel="nofollow noreferrer">a jfrog repository</a> (which might no longer exist if you click it).</p> <p>Robert Ladstätter created a <a href="http://ladstatt.blogspot.com/2013/01/2d-water-effects-with-javafx-and-scala.html" rel="nofollow noreferrer">2D water effect sample animation</a> for JavaFX 2 (using Scala). Roberts animation is like viewing the water from the side rather than above, but perhaps some of the concepts might help you.</p>
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload