Почему мое изображение покидает экран, если для X / Y установлено любое значение, кроме 0? - PullRequest
1 голос
/ 11 июня 2019

Я пытаюсь сделать подпрыгивающий логотип DVD, чтобы научиться использовать временную шкалу и ключевой кадр в javaFX.Проблема, с которой я сталкиваюсь, заключается в том, что, если я установлю X / Y изображения на любое значение, отличное от 0,0, изображение выйдет за пределы экрана.Я просто не понимаю, почему это происходит, и что мне нужно сделать, чтобы это исправить.Спасибо!

Я попытался установить изображение в разных областях панели.Я попытался вычесть больше, чем просто ширина и высота DVD, чтобы компенсировать.Я перепробовал много вещей.

public class Main extends Application {
    Stage window;

    private final int WIDTH = 700;
    private final int HEIGHT = 700;

    private Timeline timeline;

    private double xSpeed = 3;
    private double ySpeed = 3;

    private Parent createContent() {
        Pane root = new Pane();
        root.setPrefSize(WIDTH,HEIGHT);

        ImageView dvd = new ImageView(new Image("/dvd.png"));
        dvd.setFitHeight(100);
        dvd.setFitWidth(100);
        dvd.setPreserveRatio(true);
        dvd.setX(100);
        dvd.setY(100);

        dvd.setPreserveRatio(true);

        timeline = new Timeline(new KeyFrame(Duration.millis(16), e-> {
            dvd.setTranslateX(dvd.getTranslateX() + xSpeed);
            dvd.setTranslateY(dvd.getTranslateY() + ySpeed);

            if (xSpeed + dvd.getTranslateX() >= WIDTH - dvd.getFitWidth()){
                xSpeed = -xSpeed;
            } else if(xSpeed + dvd.getTranslateX() <= 0)
                xSpeed = -xSpeed;

            if (ySpeed + dvd.getTranslateY() >= HEIGHT - dvd.getFitHeight()){
                ySpeed = -ySpeed;
            } else if(ySpeed + dvd.getTranslateY() <= 0)
                ySpeed = -ySpeed;

        }));

        timeline.setCycleCount(Timeline.INDEFINITE);
        timeline.play();

        root.getChildren().add(dvd);

        return root;
    }

    @Override
    public void start(Stage primaryStage) throws Exception{
        window = primaryStage;
        Scene mainScene = new Scene(createContent(),WIDTH,HEIGHT);

        window.setResizable(false);
        window.setTitle("Bouncing DVD");
        window.setScene(mainScene);
        window.show();
    }

    public static void main(String[] args) {
        launch(args);
    }
}

Я ожидаю, что смогу разместить образ DVD в любом месте экрана и отразить его от стен сцены.

1 Ответ

2 голосов
/ 11 июня 2019

Свойства x и y ImageView - это способы перемещения ImageView из его обычного положения без влияния на свойства перевода.Любые изменения положения рендеринга с помощью преобразований, таких как свойства перевода, происходят в дополнение к этому изменению.

Диапазоны x и y, в которых отображается изображение, составляют [x+translateX, x+translateX+fitWidth) и [y+translateY, y+translateY+fitHeight) соответственно.

Самым простым способом решения этой проблемы является использование только одного свойства для измерения, например translateX и translateY:

dvd.setFitHeight(100);
dvd.setFitWidth(100);
dvd.setPreserveRatio(true);
dvd.setTranslateX(100);
dvd.setTranslateY(100);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...