当前位置: 首页 > 知识库问答 >
问题:

JavaFX画布使用固定中心旋转图像(且不反弹)

齐栋
2023-03-14

我试着用旋转的转子/头来编程一台风车。茎本身是固定的,并作为背景绘制在画布上(javafx)。转子/磁头本身是另一个图像。我想我可以旋转图像本身并将其绘制到graphicscontext上。(不起作用)然后我尝试了各种方法:

A.将图像绘制到另一张画布上,旋转画布,对画布进行快照。(没起作用)

B.制作一个图像视图,旋转图像视图,快照它并绘制它(不工作)

c、 我试着做一个旋转转换(没有成功)。现在我回到b:我旋转的图像的图像视图。

b类作品,类!它不知怎么会“反弹”,我不知道为什么,因为医生说是ImageView。设置旋转(…)围绕中心旋转图像。图像本身具有相同的高度和长度,因此它应该像矩形一样反弹。。我只想让这种反弹停止。。看这里(所以我不允许发布gif)

所有这些失败的尝试都来自这个论坛的阅读。

源代码在这里或作为文本:

package sample;

import javafx.animation.AnimationTimer;
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Scene;
import javafx.scene.SnapshotParameters;
import javafx.scene.canvas.Canvas;
import javafx.scene.canvas.GraphicsContext;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.layout.Pane;
import javafx.scene.paint.Color;
import javafx.stage.Stage;

import java.io.IOException;


public class Main extends Application {
    private Pane root;
    private Canvas canvas;
    private GraphicsContext gc;
    SnapshotParameters params = new SnapshotParameters();

    private final Image stem = new Image(getClass().getResource("windrad.png").toExternalForm());
    private final ImageView wheel = new ImageView(new Image(getClass().getResource("rad.png").toExternalForm()));

    private final int height = 720;
    private final int width = 720;
    private final double distanceWidth = 400.0 / 720.0;
    private final double distanceHeight = 240.0 / 720.0;
    private int degrees = 0;

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

    @Override
    public void start(Stage primaryStage) throws Exception{
        params.setFill(Color.TRANSPARENT);

        FXMLLoader fxmlLoader = new FXMLLoader();
        fxmlLoader.setLocation(getClass().getResource("sample.fxml"));

        try {
            root = fxmlLoader.load();
            canvas = (Canvas) fxmlLoader.getNamespace().get("canvas");
            canvas.setHeight(height);
            canvas.setWidth(width);
            primaryStage.setHeight(height);
            primaryStage.setWidth(width);
            gc = canvas.getGraphicsContext2D();
        } catch (IOException e) {
            e.printStackTrace();
        }

        primaryStage.setTitle("Hello World");
        primaryStage.setScene(new Scene(root));
        primaryStage.show();

        animation().start();
    }

    private AnimationTimer animation() {
        return new AnimationTimer() {
            @Override
            public void handle(long now) {
                gc.clearRect(0,0, width, height);
                gc.drawImage(stem, 0, 0);
                degrees = degrees >= 360 ? 0 : ++degrees;
                wheel.setRotate(degrees);
                gc.drawImage(wheel.snapshot(params, null),  width * distanceWidth - (int) wheel.getImage().getWidth() / 2, height * distanceHeight - (int) wheel.getImage().getHeight() / 2);

            }
        };
    }
}

好的,我让它工作了@詹姆斯帮了我很多忙。我没有把它画在画布上,而是把所有的对象放在一个场景图中,然后把它移到那里。因为我的转子/头部是imageview,所以我能够使用imageview。setRotate()。我的问题(为此我发布了这个帖子)是由画布的使用引起的。我仍然不知道弹跳错误是如何发生的,但我的项目目标已经实现了。新的源代码在答案中。

共有1个答案

程招
2023-03-14

我的意思是在场景图中放置节点,而不是在画布上绘制。当然,你(当然)将画布放在场景图中。但是画布一旦绘制就很难修改。-@James_D

这个评论帮助并解决了我的问题。问题中列出了新的源代码。我没有把它画到画布上,而是把所有对象放在场景图中,移动一个图像视图,而不是画布或图像。下面是新的源代码:

package sample;

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 Main extends Application {
    private Group root;

    private final ImageView stem = new ImageView(new Image(getClass().getResource("windrad.png").toExternalForm()));
    private final ImageView wheel = new ImageView(new Image(getClass().getResource("rad.png").toExternalForm()));

    private final int height = 720;
    private final int width = 720;
    private final double distanceWidth = 360.0 / 720.0;
    private final double distanceHeight = 270.0 / 720.0;

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

    @Override
    public void start(Stage primaryStage) throws Exception{
        root = new Group();
        root.getChildren().add(stem);
        root.getChildren().add(wheel);
        wheel.setX(width * distanceWidth - wheel.getImage().getWidth() / 2);
        wheel.setY(height * distanceHeight - wheel.getImage().getHeight() / 2);
        primaryStage.setTitle("Pinwheel");
        primaryStage.setScene(new Scene(root));
        primaryStage.show();
        primaryStage.getIcons().add(new Image(getClass().getResource("windrad.png").toExternalForm()));

        animation().start();
    }

    private AnimationTimer animation() {
        return new AnimationTimer() {
            @Override
            public void handle(long now) {
                wheel.setRotate(wheel.getRotate() + 1);
            }
        };
    }
}
 类似资料:
  • 我可以绘制图像,但我如何旋转该图像例如45度并绘制它,然后绘制另一个图像与-50度旋转在同一画布? 不适用于我,因为它会旋转所有画布内容。

  • 在Javafx中旋转图像? 我正在写 但是图像不会相对于图像的中心旋转。

  • 我正在编写 Java 代码来旋转固定背景图像上的图像,就像在时钟背景上旋转指针图像一样。 手表上有多个指针,一根针数小时,另一根针几分钟。 如何在固定背景下旋转2d图形图像?

  • 当我尝试使用旋转图像视图时,我现在开始学习JavaFX 它绕着它的中轴线旋转,但是当我尝试使用 它随机旋转,我不知道它的旋转轴是一样的

  • 我试着绕着它的中心旋转一个矩形。使用GraphicsContext ie gc将旋转绘制到画布上。这是我的绘图代码。 这会将矩形移动到其中心,然后围绕其左上角点旋转矩形。我试着把两边的长度和宽度减半,但那只会让它飞得到处都是。我数学不好也许这里有更好的人能告诉我我做错了什么。 如果需要的话,我还存储了矩形的所有四个点(角)。 谢了乔

  • 我刚开始使用PDFBox。我需要的是将图像旋转添加到退出的PDF中!我知道如何添加图像,但我的问题是如何旋转图像!我看到了一些关于AffineTransform和Matrix的信息,但我不知道那是什么以及它是如何工作的! 我真的很感谢通过一些样本代码,并提前感谢你! 致敬