使用文本的JavaFX逆剪裁和剪裁?

问题描述:

到目前为止,我所能找到的关于JavaFX中的裁剪的方法是Node.setClip(Node value)方法。这迫使节点仅在给定节点的边界内呈现。我想做相反的事情 - 根据第二个节点的形状(特别是文本)剪掉一部分节点。在(主要是)伪代码:使用文本的JavaFX逆剪裁和剪裁?

Rectangle rect = new Rectangle(0, 0, 160, 90); 
Label cutOutText = new Label("YAY"); 
rect.setFill(Color.RED); 
rect.setInverseClip(cutOutText); 

这将导致(白色背景)...

The resulting rectangle, with punched-out text.

又如:

enter image description here

没有据我所知,这是内置的方法。然而,这里是您尝试使用形状才达到什么样的例子:

package application; 

import javafx.application.Application; 
import javafx.beans.binding.Bindings; 
import javafx.scene.Node; 
import javafx.scene.Scene; 
import javafx.scene.control.ProgressBar; 
import javafx.scene.effect.InnerShadow; 
import javafx.scene.image.Image; 
import javafx.scene.image.ImageView; 
import javafx.scene.layout.StackPane; 
import javafx.scene.shape.Rectangle; 
import javafx.scene.shape.Shape; 
import javafx.scene.text.Font; 
import javafx.scene.text.Text; 
import javafx.stage.Stage; 


public class Main extends Application { 
    @Override 
    public void start(final Stage primaryStage) { 
     final StackPane root = new StackPane(); 
     final ProgressBar bar = new ProgressBar(); 
     final Image image = new Image("https://farm8.staticflickr.com/7036/6952932649_3fc1cfeb8a_o_d.jpg", true); 
     final ImageView imageView = new ImageView(image); 
     final Text clip = new Text("JavaFx"); 
     final Scene scene = new Scene(root); 

     root.setStyle("-fx-background: pink;"); 
     root.setEffect(new InnerShadow()); 

     bar.prefWidthProperty().bind(root.widthProperty()); 
     bar.visibleProperty().bind(Bindings.notEqual(1, image.progressProperty())); 
     bar.progressProperty().bind(image.progressProperty()); 

     imageView.setFitWidth(800); 
     imageView.setFitHeight(600); 

     clip.setFont(Font.font(144.0)); 
    clip.setX(400 - clip.getBoundsInLocal().getWidth()/2); 
     clip.setY(400 - clip.getBoundsInLocal().getHeight()/2); 

     setInverseClip(imageView, clip); 

     root.getChildren().add(bar); 
     root.getChildren().add(imageView); 

     primaryStage.setScene(scene); 
     primaryStage.show(); 
} 

    private void setInverseClip(final Node node, final Shape clip) { 
     final Rectangle inverse = new Rectangle(); 
     inverse.setWidth(node.getLayoutBounds().getWidth()); 
     inverse.setHeight(node.getLayoutBounds().getHeight()); 
     node.setClip(Shape.subtract(inverse, clip)); 
    } 

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

} 

它覆盖相同尺寸的矩形目标节点,从中减去原始剪辑节点,并使用新创建的形状作为剪辑到目标节点。

+2

谢谢!对于任何想与我一样的人,只需查看javafx.scene.Shape.subtract(形状1,形状2)。它从第一个Shape切出第二个Shape之后返回一个新节点。 –

+0

Gist不见了;你可以添加一个代码样本到SO吗? –

+1

@ErikHumphrey我可以看到它...... – Line