ensemble.samples.graphics2d.bouncingballs.Ball Maven / Gradle / Ivy
/*
* Copyright (c) 2008, 2014, Oracle and/or its affiliates.
* All rights reserved. Use is subject to license terms.
*
* This file is available and licensed under the following license:
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* - Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* - Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the distribution.
* - Neither the name of Oracle Corporation nor the names of its
* contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package ensemble.samples.graphics2d.bouncingballs;
import static ensemble.samples.graphics2d.bouncingballs.Constants.*;
import javafx.animation.Animation.Status;
import javafx.animation.Interpolator;
import javafx.animation.KeyFrame;
import javafx.animation.KeyValue;
import javafx.animation.Timeline;
import javafx.event.EventHandler;
import javafx.scene.input.MouseEvent;
import javafx.scene.shape.Circle;
import javafx.util.Duration;
public class Ball extends Circle {
private static final Duration DURATION = Duration.millis(850);
private static final double FLOOR = HEIGHT / 2 - HEIGHT_CORRECTION - 10;
private Timeline timeline;
public Ball(final int index) {
initBall(index);
}
private void initBall(final int index) {
setRadius(BALL_RADIUS);
setCenterX((index + 1) * 2 * BALL_RADIUS + index * SPACE_X);
setCenterY(INFOPANEL_HEIGHT + BALL_RADIUS);
setCache(true);
setFill(BALL_GRADIENT);
createTimeline();
setOnMousePressed((MouseEvent me) -> {
if (timeline.getStatus() != Status.RUNNING) {
timeline.play();
} else {
timeline.pause();
}
});
}
private void createTimeline() {
timeline = new Timeline();
timeline.setCycleCount(Timeline.INDEFINITE);
timeline.setAutoReverse(true);
final KeyValue kv = new KeyValue(
translateYProperty(),
FLOOR ,
Interpolator.SPLINE(0.05f, 0, 0.5f, 0));
final KeyFrame kf = new KeyFrame(DURATION, kv);
timeline.getKeyFrames().setAll(kf);
}
public void reset() {
timeline.stop();
setTranslateY(0);
}
}