使用文本的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);
这将导致(白色背景)...
又如:
答
没有据我所知,这是内置的方法。然而,这里是您尝试使用形状才达到什么样的例子:
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);
}
}
它覆盖相同尺寸的矩形目标节点,从中减去原始剪辑节点,并使用新创建的形状作为剪辑到目标节点。
谢谢!对于任何想与我一样的人,只需查看javafx.scene.Shape.subtract(形状1,形状2)。它从第一个Shape切出第二个Shape之后返回一个新节点。 –
Gist不见了;你可以添加一个代码样本到SO吗? –
@ErikHumphrey我可以看到它...... – Line