有一个BallPane类,
package javafx_ex;
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{
public final 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.setFill(Color.GREEN);
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()+1);
}
public void decreaseSpeed(){
animation.setRate(animation.getRate()>0 ? animation.getRate()-1 : 0);
}
public DoubleProperty rateProperty(){
if(animation.getRate()==0.0){
circle=new Circle(circle.getCenterX(),circle.getCenterY(),radius);
circle.setFill(Color.GREEN);
}
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);
}
}
主函数,
package javafx_ex;
import javafx.application.Application;
import javafx.stage.Stage;
import javafx.scene.Scene;
import javafx.scene.input.KeyCode;
import javafx.scene.control.Slider;
import javafx.scene.layout.BorderPane;
public class BounceBallSlider extends Application{
@Override
public void start(Stage primaryStage){
BallPane ballPane=new BallPane();
Slider slSpeed=new Slider();
slSpeed.setMax(20);
slSpeed.setValue(10);
ballPane.rateProperty().bind(slSpeed.valueProperty());
BorderPane pane=new BorderPane();
pane.setCenter(ballPane);
pane.setBottom(slSpeed);
ballPane.setOnMousePressed(e->ballPane.pause());
ballPane.setOnMouseReleased(e->ballPane.play());
slSpeed.setOnKeyPressed(e->{
if(e.getCode()==KeyCode.UP){
slSpeed.setValue(slSpeed.getValue()+1);
}
else if(e.getCode()==KeyCode.DOWN){
slSpeed.setValue(slSpeed.getValue()-1);
}
});
Scene scene=new Scene(pane,250,150);
primaryStage.setTitle("BounceBallControl");
primaryStage.setScene(scene);
primaryStage.show();
slSpeed.requestFocus();
}
public static void main(String[] args){
Application.launch(args);
}
}
出现的问题是:小球速度降为0后,再增加速度,小球不是从上次静止的位置开始运动,如果让它从上次静止的位置开始运动呢?
我查看了Animation.class的源代码,里面有这样一句话,
An {@code Animation}'s play head can be randomly positioned, whether it is
* running or not. If the {@code Animation} is running, the play head jumps to
* the specified position immediately and continues playing from new position.
* If the {@code Animation} is not running, the next {@link #play()} will start
* the {@code Animation} from the specified position.
这句话是什么意思呢?