(1)定义一个名为BallPane的类,用于显示一个弹动的球;
(2)定义一个名为BounceBallControl的类,用来使用鼠标动作控制弹球,当鼠标按下的时候动画暂停,当鼠标释放的时候动画恢复执行,按下Up/Down方向键的时候可以增加/减少动画的速度。
BallPane类:
import javafx.animation.KeyFrame; import javafx.animation.Timeline; import javafx.beans.property.DoubleProperty; import javafx.scene.layout.Pane; import javafx.scene.paint.Color; import javafx.scene.shape.Circle; import javafx.util.Duration; public class BallPane extends Pane{ private double radius = 20; private double x = radius, y = radius; private double dx = 1, dy = 1; private Circle circle = new Circle(x, y, radius); private Timeline animation; public BallPane() { circle.setStroke(Color.BLACK); circle.setFill(Color.ORANGE); getChildren().add(circle); animation = new Timeline( new KeyFrame(Duration.millis(50), e -> moveBall())); animation.setCycleCount(Timeline.INDEFINITE); animation.play(); } public void play() { animation.play(); } public void pause() { animation.pause(); } public void increaseSpeed() { animation.setRate(animation.getRate() + 0.1); } public void decreaseSpeed() { animation.setRate(animation.getRate() > 0 ? animation.getRate() - 0.1 : 0); } public DoubleProperty rateProperty() { return animation.rateProperty(); } protected void moveBall() { if(x < radius || x > getWidth() - radius) { dx *= -1; } if(y < radius || y > getHeight() - radius) { dy *= -1; } x += dx; y += dy; circle.setCenterX(x); circle.setCenterY(y); } }
BounceBallControl类:
import javafx.application.Application; import javafx.scene.Scene; import javafx.scene.input.KeyCode; import javafx.stage.Stage; public class BounceBallControl extends Application{ @Override public void start(Stage primaryStage) throws Exception { BallPane ballPane = new BallPane(); ballPane.setOnMousePressed(e -> ballPane.pause()); ballPane.setOnMouseReleased(e -> ballPane.play()); //控制速度 ballPane.setOnKeyPressed(e -> { if(e.getCode() == KeyCode.UP) { ballPane.increaseSpeed(); } else if(e.getCode() == KeyCode.DOWN) { ballPane.decreaseSpeed(); } }); Scene scene = new Scene(ballPane, 250, 150); primaryStage.setTitle("Bounce Ball Control"); primaryStage.setScene(scene); primaryStage.show(); //将输入焦点设置到ballPane上 ballPane.requestFocus(); } public static void main(String[] args) { Application.launch(args); } }