根据旋转角度更改 ImageView 位置
Changing ImageView position based on angle of rotation
我正在尝试让一个ImageView
根据它面向的方向改变它的位置。
import javafx.animation.AnimationTimer;
import javafx.application.Application;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.stage.Stage;
public class Demo extends Application {
public void start(Stage window) {
window.setTitle("Changing ImageView position based on angle of rotation");
int speed = 10; // You can modify the speed here
ImageView imageView = new ImageView(new Image("https://encrypted-tbn0.gstatic.com/images?q=tbn%3AANd9GcTBJoRKh1UKimWTSLdabW2b8RSLDeSgMfSqqg&usqp=CAU"));
imageView.setX(100);
imageView.setY(100);
imageView.setRotate(65); // This is where you can change the angle of rotation
Group root = new Group();
root.getChildren().add(imageView);
Scene scene = new Scene(root);
window.setScene(scene);
final long[] lastNanoTime = {System.nanoTime()};
new AnimationTimer() {
@Override
public void handle(long currentTime) {
double elapsedTime = (currentTime - lastNanoTime[0]) / 1000000000.0;
lastNanoTime[0] = currentTime;
imageView.setX(imageView.getX() + Math.sin(Math.toRadians(imageView.getRotate())) * speed * elapsedTime);
imageView.setY(imageView.getY() + Math.cos(Math.toRadians(imageView.getRotate())) * speed * elapsedTime);
}
}.start();
window.show();
}
public static void main(String[] args) {
launch(args);
}
}
以上代码是基于我正在使用的代码。您可以相应地调整度数以查看问题。 ImageView
不会朝它所面对的方向移动。注意:为了这个演示,我在网上找到了一个随机的 .png 文件。您可以在自己的代码中替换为不同的图像,以便更好地可视化问题。
问题是,ImageView
没有朝它面对的方向移动。当垂直方向(0° 或 180°)时,ImageView
向后移动,但当水平方向(90° 或 270°)时,它会像它应该的那样直线向前移动。当沿对角线方向时,它会在两者之间移动。
我做错了什么,我该如何解决?
y
轴方向向下。因此,当角度为 0 并增加 y
值时,您将向下移动。
要使图像在角度为 0 时向上移动,只需更改增量符号:
imageView.setY(imageView.getY() + Math.cos(Math.toRadians(imageView.getRotate())) * speed * elapsedTime);
到
imageView.setY(imageView.getY() - Math.cos(Math.toRadians(imageView.getRotate())) * speed * elapsedTime);
所以角度为 0 应该向上移动图像,90 度向右,180 度向下等等。
我正在尝试让一个ImageView
根据它面向的方向改变它的位置。
import javafx.animation.AnimationTimer;
import javafx.application.Application;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.stage.Stage;
public class Demo extends Application {
public void start(Stage window) {
window.setTitle("Changing ImageView position based on angle of rotation");
int speed = 10; // You can modify the speed here
ImageView imageView = new ImageView(new Image("https://encrypted-tbn0.gstatic.com/images?q=tbn%3AANd9GcTBJoRKh1UKimWTSLdabW2b8RSLDeSgMfSqqg&usqp=CAU"));
imageView.setX(100);
imageView.setY(100);
imageView.setRotate(65); // This is where you can change the angle of rotation
Group root = new Group();
root.getChildren().add(imageView);
Scene scene = new Scene(root);
window.setScene(scene);
final long[] lastNanoTime = {System.nanoTime()};
new AnimationTimer() {
@Override
public void handle(long currentTime) {
double elapsedTime = (currentTime - lastNanoTime[0]) / 1000000000.0;
lastNanoTime[0] = currentTime;
imageView.setX(imageView.getX() + Math.sin(Math.toRadians(imageView.getRotate())) * speed * elapsedTime);
imageView.setY(imageView.getY() + Math.cos(Math.toRadians(imageView.getRotate())) * speed * elapsedTime);
}
}.start();
window.show();
}
public static void main(String[] args) {
launch(args);
}
}
以上代码是基于我正在使用的代码。您可以相应地调整度数以查看问题。 ImageView
不会朝它所面对的方向移动。注意:为了这个演示,我在网上找到了一个随机的 .png 文件。您可以在自己的代码中替换为不同的图像,以便更好地可视化问题。
问题是,ImageView
没有朝它面对的方向移动。当垂直方向(0° 或 180°)时,ImageView
向后移动,但当水平方向(90° 或 270°)时,它会像它应该的那样直线向前移动。当沿对角线方向时,它会在两者之间移动。
我做错了什么,我该如何解决?
y
轴方向向下。因此,当角度为 0 并增加 y
值时,您将向下移动。
要使图像在角度为 0 时向上移动,只需更改增量符号:
imageView.setY(imageView.getY() + Math.cos(Math.toRadians(imageView.getRotate())) * speed * elapsedTime);
到
imageView.setY(imageView.getY() - Math.cos(Math.toRadians(imageView.getRotate())) * speed * elapsedTime);
所以角度为 0 应该向上移动图像,90 度向右,180 度向下等等。