JavaFX使用复杂形状剪辑掩码

3
我是一名有用的助手,可以翻译文本。

我正在创建一个简单的JavaFX应用程序。我只想从两个同心圆之间提供的区域中剪切图像,该区域随鼠标移动而更改中心坐标,剪切的对象最初出现在定义的位置,但不响应鼠标移动。请告诉我我做错了什么。

我的代码是:

public DoubleProperty xCordinate;
public DoubleProperty yCordinate;

@Override
public void start(Stage primaryStage) {

    Group root = new Group();
    Image image = new Image(MyClass.class
            .getResource("Water lilies.jpg").toExternalForm());
    Scene scene = new Scene(root, image.getWidth(), image.getHeight(),
            Color.WHITE);
    ImageView view = new ImageView();
    view.setImage(image);
    xCordinate = new SimpleDoubleProperty(100.0f);
    yCordinate = new SimpleDoubleProperty(100.0f);
    scene.setOnMouseMoved(new EventHandler<MouseEvent>() {
        @Override
        public void handle(MouseEvent event) {
            xCordinate.set(event.getX());
            yCordinate.set(event.getY());
            System.out.println("xCordinate " + xCordinate + " yCordinate "
                    + yCordinate);
        }

    });

    Circle c1 = new Circle();
    c1.centerXProperty().bind(xCordinate);
    c1.centerYProperty().bind(yCordinate);
    c1.setRadius(50.0f);
    Circle c2 = new Circle();
    c2.centerXProperty().bind(xCordinate);
    c2.centerYProperty().bind(yCordinate);
    c2.setRadius(35.0f);

    Shape mask = Path.subtract(c1, c2);

    view.setClip(mask);
    root.getChildren().add(view);
    primaryStage.setScene(scene);
    primaryStage.show();

}
1个回答

6

每次圆的位置改变时,都需要更新掩码剪辑。顺便说一下,不错的应用程序。

@Override
    public void start(Stage primaryStage) {
        Group root = new Group();
        Image image = new Image(MyClass.class.getResource("Water lilies.jpg").toExternalForm());
        Scene scene = new Scene(root, image.getWidth(), image.getHeight(), Color.WHITE);
        final ImageView view = new ImageView();
        view.setImage(image);

        xCordinate = new SimpleDoubleProperty(100.0f);
        yCordinate = new SimpleDoubleProperty(100.0f);


        final Circle c1 = new Circle();
        c1.centerXProperty().bind(xCordinate);
        c1.centerYProperty().bind(yCordinate);
        c1.setRadius(50.0f);

        final Circle c2 = new Circle();
        c2.centerXProperty().bind(xCordinate);
        c2.centerYProperty().bind(yCordinate);
        c2.setRadius(35.0f);

        scene.setOnMouseMoved(new EventHandler<MouseEvent>() {
            @Override
            public void handle(MouseEvent event) {
                xCordinate.set(event.getX());
                yCordinate.set(event.getY());
                System.out.println("xCordinate " + xCordinate + " yCordinate " + yCordinate);
                // update mask clip
                Shape mask = Path.subtract(c1, c2);
                view.setClip(mask);
            }
        });

        Shape mask = Path.subtract(c1, c2);
        view.setClip(mask);

        root.getChildren().add(view);
        primaryStage.setScene(scene);
        primaryStage.show();
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接