2015-11-24 52 views
5

到目前爲止,我所能找到的關於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

回答

3

沒有據我所知,這是內置的方法。然而,這裏是您嘗試使用形狀才達到什麼樣的例子:

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