在javafx中用两条线模拟雨刮器的摆动动画
时间: 2023-12-06 16:39:50 浏览: 79
汽车雨刮DMU运动模拟
可以使用JavaFX的AnimationTimer来实现这个动画效果。以下是一个简单的实现:
```java
import javafx.animation.AnimationTimer;
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.canvas.Canvas;
import javafx.scene.canvas.GraphicsContext;
import javafx.scene.layout.StackPane;
import javafx.scene.paint.Color;
import javafx.stage.Stage;
public class RainScraperAnimation extends Application {
private double angle = 0;
private double angleDelta = 0.05;
private double bladeLength = 100;
private double bladeWidth = 5;
private double bladeDistance = 20;
private double bladeSpeed = 0.3;
private double rainSpeed = 10;
private double rainSize = 2;
private double canvasWidth = 400;
private double canvasHeight = 400;
@Override
public void start(Stage primaryStage) throws Exception {
Canvas canvas = new Canvas(canvasWidth, canvasHeight);
GraphicsContext gc = canvas.getGraphicsContext2D();
StackPane root = new StackPane(canvas);
Scene scene = new Scene(root);
primaryStage.setScene(scene);
primaryStage.show();
AnimationTimer timer = new AnimationTimer() {
long lastTime = 0;
@Override
public void handle(long now) {
if (lastTime == 0) {
lastTime = now;
return;
}
double elapsedTime = (now - lastTime) / 1_000_000_000.0;
lastTime = now;
gc.setFill(Color.WHITE);
gc.fillRect(0, 0, canvasWidth, canvasHeight);
gc.translate(canvasWidth / 2, canvasHeight / 2);
gc.rotate(angle);
// draw blades
gc.setFill(Color.GRAY);
gc.fillRect(-bladeWidth / 2, 0, bladeWidth, bladeLength);
gc.fillRect(bladeDistance - bladeWidth / 2, 0, bladeWidth, bladeLength);
// animate blades
angle += angleDelta;
if (angle > 30 || angle < -30) {
angleDelta = -angleDelta;
}
// draw rain drops
gc.setFill(Color.BLUE);
for (int i = 0; i < canvasWidth / rainSpeed; i++) {
double x = i * rainSpeed - canvasWidth / 2;
double y = Math.random() * canvasHeight / 2;
gc.fillOval(x, y, rainSize, rainSize);
}
gc.rotate(-angle);
gc.translate(-canvasWidth / 2, -canvasHeight / 2);
}
};
timer.start();
}
public static void main(String[] args) {
launch(args);
}
}
```
上面的代码中,我们使用了GraphicsContext来绘制图形,使用AnimationTimer来更新画布上的内容。在handle方法中,我们首先清空画布,然后绘制雨刮器的两个刮板和雨滴。接着我们更新刮板的旋转角度,如果角度已经到达了一定的范围,就反转角度的变化方向,让刮板来回摆动。最后我们将画布还原到原来的位置和旋转角度。
在上面的代码中,我们使用了一些变量来控制动画的参数,例如刮板的长度、宽度、距离、速度,雨滴的大小、速度,画布的大小等等。你可以尝试修改这些参数,看看会有什么不同的效果。
阅读全文