下面列出了javafx.scene.text.Text#setStroke ( ) 实例代码,或者点击链接到github查看源代码,也可以在右侧发表评论。
private void populate() {
// fill the background
Circle circle = new Circle();
circle.centerXProperty().bind(Bindings.divide(widthProperty(), 2));
circle.centerYProperty().bind(Bindings.divide(heightProperty(), 2));
circle.radiusProperty().bind(Bindings.divide(widthProperty(), 2));
circle.setFill(backgroundColor);
Text text = new Text(name);
text.setStroke(foregroundColor);
text.setBoundsType(TextBoundsType.VISUAL);
getChildren().addAll(circle, text);
}
@Override
protected void initUI() {
Text scoreText = getUIFactoryService().newText("", Color.WHITE, 28);
scoreText.setTranslateX(60);
scoreText.setTranslateY(70);
scoreText.textProperty().bind(getip("score").asString());
scoreText.setStroke(Color.GOLD);
Text multText = getUIFactoryService().newText("", Color.WHITE, 28);
multText.setTranslateX(60);
multText.setTranslateY(90);
multText.textProperty().bind(getip("multiplier").asString("x %d"));
var livesText = getUIFactoryService().newText("", Color.WHITE, 24.0);
livesText.setTranslateX(60);
livesText.setTranslateY(110);
livesText.textProperty().bind(getip("lives").asString("Lives: %d"));
getGameScene().addUINodes(multText, scoreText, livesText);
Text beware = getUIFactoryService().newText("Beware! Seekers get smarter every spawn!", Color.AQUA, 38);
addUINode(beware);
centerText(beware);
animationBuilder()
.duration(Duration.seconds(2))
.autoReverse(true)
.repeat(2)
.fadeIn(beware)
.buildAndPlay();
}
private void initGraphics() {
// Set initial size
if (Double.compare(gauge.getPrefWidth(), 0.0) <= 0 || Double.compare(gauge.getPrefHeight(), 0.0) <= 0 ||
Double.compare(gauge.getWidth(), 0.0) <= 0 || Double.compare(gauge.getHeight(), 0.0) <= 0) {
if (gauge.getPrefWidth() > 0 && gauge.getPrefHeight() > 0) {
gauge.setPrefSize(gauge.getPrefWidth(), gauge.getPrefHeight());
} else {
gauge.setPrefSize(PREFERRED_WIDTH, PREFERRED_HEIGHT);
}
}
backgroundCanvas = new Canvas(PREFERRED_WIDTH, PREFERRED_HEIGHT);
backgroundCtx = backgroundCanvas.getGraphicsContext2D();
barCanvas = new Canvas(PREFERRED_WIDTH, PREFERRED_HEIGHT);
barCtx = barCanvas.getGraphicsContext2D();
valueBkgText = new Text();
valueBkgText.setStroke(null);
valueBkgText.setFill(Helper.getTranslucentColorFrom(valueColor, 0.1));
valueText = new Text();
valueText.setStroke(null);
valueText.setFill(valueColor);
Helper.enableNode(valueText, gauge.isValueVisible());
pane = new Pane(backgroundCanvas, barCanvas, valueBkgText, valueText);
pane.setBackground(new Background(new BackgroundFill(gauge.getBackgroundPaint(), new CornerRadii(1024), Insets.EMPTY)));
pane.setBorder(new Border(new BorderStroke(gauge.getBorderPaint(), BorderStrokeStyle.SOLID, new CornerRadii(1024), new BorderWidths(gauge.getBorderWidth()))));
getChildren().setAll(pane);
}
@Override
protected void initUI() {
Text scoreText = getUIFactoryService().newText("", Color.WHITE, 28);
scoreText.setTranslateX(60);
scoreText.setTranslateY(70);
scoreText.textProperty().bind(getip("score").asString());
scoreText.setStroke(Color.GOLD);
Text multText = getUIFactoryService().newText("", Color.WHITE, 28);
multText.setTranslateX(60);
multText.setTranslateY(90);
multText.textProperty().bind(getip("multiplier").asString("x %d"));
var livesText = getUIFactoryService().newText("", Color.WHITE, 24.0);
livesText.setTranslateX(60);
livesText.setTranslateY(110);
livesText.textProperty().bind(getip("lives").asString("Lives: %d"));
getGameScene().addUINodes(multText, scoreText, livesText);
Text beware = getUIFactoryService().newText("Beware! Seekers get smarter every spawn!", Color.AQUA, 38);
addUINode(beware);
centerText(beware);
animationBuilder()
.duration(Duration.seconds(2))
.autoReverse(true)
.repeat(2)
.fadeIn(beware)
.buildAndPlay();
}
public MenuItem(String name, int width) {
setAlignment(Pos.CENTER_LEFT);
text = new Text(name);
text.setTranslateX(5);
text.setFont(font);
text.setFill(Colors.MENU_TEXT);
text.setStroke(Color.BLACK);
shadow = new DropShadow(5, Color.BLACK);
text.setEffect(shadow);
selection = new Rectangle(width - 45, 30);
selection.setFill(Colors.MENU_ITEM_SELECTION);
selection.setStroke(Color.BLACK);
selection.setVisible(false);
GaussianBlur blur = new GaussianBlur(8);
selection.setEffect(blur);
getChildren().addAll(selection, text);
setOnMouseEntered(e -> {
onSelect();
});
setOnMouseExited(e -> {
onDeselect();
});
setOnMousePressed(e -> {
text.setFill(Color.YELLOW);
});
}
public TimelineEventsSample() {
super(70,70);
//create a circle with effect
final Circle circle = new Circle(20, Color.rgb(156,216,255));
circle.setEffect(new Lighting());
//create a text inside a circle
final Text text = new Text (i.toString());
text.setStroke(Color.BLACK);
//create a layout for circle with text inside
final StackPane stack = new StackPane();
stack.getChildren().addAll(circle, text);
stack.setLayoutX(30);
stack.setLayoutY(30);
//create a timeline for moving the circle
timeline = new Timeline();
timeline.setCycleCount(Timeline.INDEFINITE);
timeline.setAutoReverse(true);
//one can add a specific action when each frame is started. There are one or more frames during
// executing one KeyFrame depending on set Interpolator.
timer = new AnimationTimer() {
@Override
public void handle(long l) {
text.setText(i.toString());
i++;
}
};
//create a keyValue with factory: scaling the circle 2times
KeyValue keyValueX = new KeyValue(stack.scaleXProperty(), 2);
KeyValue keyValueY = new KeyValue(stack.scaleYProperty(), 2);
//create a keyFrame, the keyValue is reached at time 2s
Duration duration = Duration.seconds(2);
//one can add a specific action when the keyframe is reached
EventHandler<ActionEvent> onFinished = new EventHandler<ActionEvent>() {
public void handle(ActionEvent t) {
stack.setTranslateX(java.lang.Math.random()*200-100);
//reset counter
i = 0;
}
};
KeyFrame keyFrame = new KeyFrame(duration, onFinished , keyValueX, keyValueY);
//add the keyframe to the timeline
timeline.getKeyFrames().add(keyFrame);
getChildren().add(stack);
}
public TimelineEventsSample() {
super(70,70);
//create a circle with effect
final Circle circle = new Circle(20, Color.rgb(156,216,255));
circle.setEffect(new Lighting());
//create a text inside a circle
final Text text = new Text (i.toString());
text.setStroke(Color.BLACK);
//create a layout for circle with text inside
final StackPane stack = new StackPane();
stack.getChildren().addAll(circle, text);
stack.setLayoutX(30);
stack.setLayoutY(30);
//create a timeline for moving the circle
timeline = new Timeline();
timeline.setCycleCount(Timeline.INDEFINITE);
timeline.setAutoReverse(true);
//one can add a specific action when each frame is started. There are one or more frames during
// executing one KeyFrame depending on set Interpolator.
timer = new AnimationTimer() {
@Override
public void handle(long l) {
text.setText(i.toString());
i++;
}
};
//create a keyValue with factory: scaling the circle 2times
KeyValue keyValueX = new KeyValue(stack.scaleXProperty(), 2);
KeyValue keyValueY = new KeyValue(stack.scaleYProperty(), 2);
//create a keyFrame, the keyValue is reached at time 2s
Duration duration = Duration.seconds(2);
//one can add a specific action when the keyframe is reached
EventHandler<ActionEvent> onFinished = new EventHandler<ActionEvent>() {
public void handle(ActionEvent t) {
stack.setTranslateX(java.lang.Math.random()*200-100);
//reset counter
i = 0;
}
};
KeyFrame keyFrame = new KeyFrame(duration, onFinished , keyValueX, keyValueY);
//add the keyframe to the timeline
timeline.getKeyFrames().add(keyFrame);
getChildren().add(stack);
}
private void init(Stage primaryStage) {
Group root = new Group();
primaryStage.setResizable(false);
primaryStage.setScene(new Scene(root, 260,100));
//create a circle with effect
final Circle circle = new Circle(20, Color.rgb(156,216,255));
circle.setEffect(new Lighting());
//create a text inside a circle
final Text text = new Text (i.toString());
text.setStroke(Color.BLACK);
//create a layout for circle with text inside
final StackPane stack = new StackPane();
stack.getChildren().addAll(circle, text);
stack.setLayoutX(30);
stack.setLayoutY(30);
//create a timeline for moving the circle
timeline = new Timeline();
timeline.setCycleCount(Timeline.INDEFINITE);
timeline.setAutoReverse(true);
//one can add a specific action when each frame is started. There are one or more frames during
// executing one KeyFrame depending on set Interpolator.
timer = new AnimationTimer() {
@Override
public void handle(long l) {
text.setText(i.toString());
i++;
}
};
//create a keyValue with factory: scaling the circle 2times
KeyValue keyValueX = new KeyValue(stack.scaleXProperty(), 2);
KeyValue keyValueY = new KeyValue(stack.scaleYProperty(), 2);
//create a keyFrame, the keyValue is reached at time 2s
Duration duration = Duration.seconds(2);
//one can add a specific action when the keyframe is reached
EventHandler<ActionEvent> onFinished = new EventHandler<ActionEvent>() {
public void handle(ActionEvent t) {
stack.setTranslateX(java.lang.Math.random()*200);
//reset counter
i = 0;
}
};
KeyFrame keyFrame = new KeyFrame(duration, onFinished , keyValueX, keyValueY);
//add the keyframe to the timeline
timeline.getKeyFrames().add(keyFrame);
root.getChildren().add(stack);
}
private void addScoreKill(Point2D enemyPosition) {
inc("kills", +1);
if (geti("kills") == 15) {
set("kills", 0);
inc("multiplier", +1);
}
final int multiplier = geti("multiplier");
inc("score", +100*multiplier);
var shadow = new DropShadow(25, Color.WHITE);
Text bonusText = getUIFactoryService().newText("+100" + (multiplier == 1 ? "" : "x" + multiplier), Color.color(1, 1, 1, 0.8), 24);
bonusText.setStroke(Color.GOLD);
bonusText.setEffect(shadow);
var e = entityBuilder()
.at(enemyPosition)
.view(bonusText)
.buildAndAttach();
animationBuilder()
.onFinished(() -> e.removeFromWorld())
.interpolator(Interpolators.EXPONENTIAL.EASE_OUT())
.translate(e)
.from(enemyPosition)
.to(enemyPosition.subtract(0, 65))
.buildAndPlay();
animationBuilder()
.duration(Duration.seconds(0.35))
.autoReverse(true)
.repeat(2)
.interpolator(Interpolators.BOUNCE.EASE_IN())
.scale(e)
.from(new Point2D(1, 1))
.to(new Point2D(1.2, 0.85))
.buildAndPlay();
}
private void initGraphics() {
// Set initial size
if (Double.compare(gauge.getPrefWidth(), 0.0) <= 0 || Double.compare(gauge.getPrefHeight(), 0.0) <= 0 ||
Double.compare(gauge.getWidth(), 0.0) <= 0 || Double.compare(gauge.getHeight(), 0.0) <= 0) {
if (gauge.getPrefWidth() > 0 && gauge.getPrefHeight() > 0) {
gauge.setPrefSize(gauge.getPrefWidth(), gauge.getPrefHeight());
} else {
gauge.setPrefSize(PREFERRED_WIDTH, PREFERRED_HEIGHT);
}
}
arcExtend = gauge.getArcExtend();
backgroundCanvas = new Canvas(PREFERRED_WIDTH, PREFERRED_HEIGHT);
backgroundCtx = backgroundCanvas.getGraphicsContext2D();
barCanvas = new Canvas(PREFERRED_WIDTH, PREFERRED_HEIGHT);
barCtx = barCanvas.getGraphicsContext2D();
titleText = new Text(gauge.getTitle());
titleText.setFill(gauge.getTitleColor());
Helper.enableNode(titleText, !gauge.getTitle().isEmpty());
valueBkgText = new Text();
valueBkgText.setStroke(null);
valueBkgText.setFill(Helper.getTranslucentColorFrom(valueColor, 0.1));
Helper.enableNode(valueBkgText, gauge.isValueVisible());
valueText = new Text();
valueText.setStroke(null);
valueText.setFill(valueColor);
Helper.enableNode(valueText, gauge.isValueVisible());
if (gauge.isGradientBarEnabled()) { setupGradient(); }
pane = new Pane(backgroundCanvas, barCanvas, titleText, valueBkgText, valueText);
pane.setBorder(new Border(new BorderStroke(gauge.getBorderPaint(), BorderStrokeStyle.SOLID, new CornerRadii(1024), new BorderWidths(gauge.getBorderWidth()))));
pane.setBackground(new Background(new BackgroundFill(gauge.getBackgroundPaint(), new CornerRadii(1024), Insets.EMPTY)));
getChildren().setAll(pane);
}
private void initGraphics() {
// Set initial size
if (Double.compare(gauge.getPrefWidth(), 0.0) <= 0 || Double.compare(gauge.getPrefHeight(), 0.0) <= 0 ||
Double.compare(gauge.getWidth(), 0.0) <= 0 || Double.compare(gauge.getHeight(), 0.0) <= 0) {
if (gauge.getPrefWidth() > 0 && gauge.getPrefHeight() > 0) {
gauge.setPrefSize(gauge.getPrefWidth(), gauge.getPrefHeight());
} else {
gauge.setPrefSize(PREFERRED_WIDTH, PREFERRED_HEIGHT);
}
}
sectionCanvas = new Canvas(PREFERRED_WIDTH, PREFERRED_HEIGHT);
sectionCtx = sectionCanvas.getGraphicsContext2D();
barBackground = new Arc(PREFERRED_WIDTH * 0.5, PREFERRED_HEIGHT * 0.5, PREFERRED_WIDTH * 0.4, PREFERRED_HEIGHT * 0.4, gauge.getStartAngle() + 90, -ANGLE_RANGE);
barBackground.setType(ArcType.OPEN);
barBackground.setStroke(gauge.getBarBackgroundColor());
barBackground.setStrokeWidth(PREFERRED_WIDTH * 0.125);
barBackground.setStrokeLineCap(StrokeLineCap.BUTT);
barBackground.setFill(null);
bar = new Arc(PREFERRED_WIDTH * 0.5, PREFERRED_HEIGHT * 0.5, PREFERRED_WIDTH * 0.4, PREFERRED_HEIGHT * 0.4, gauge.getStartAngle() + 90, 0);
bar.setType(ArcType.OPEN);
bar.setStroke(gauge.getBarColor());
bar.setStrokeWidth(PREFERRED_WIDTH * 0.125);
bar.setStrokeLineCap(StrokeLineCap.BUTT);
bar.setFill(null);
titleText = new Text(gauge.getTitle());
titleText.setFill(gauge.getTitleColor());
Helper.enableNode(titleText, !gauge.getTitle().isEmpty());
valueText = new Text();
valueText.setStroke(null);
valueText.setFill(gauge.getValueColor());
Helper.enableNode(valueText, gauge.isValueVisible());
unitText = new Text();
unitText.setStroke(null);
unitText.setFill(gauge.getUnitColor());
Helper.enableNode(unitText, gauge.isValueVisible() && !gauge.getUnit().isEmpty());
pane = new Pane(barBackground, sectionCanvas, titleText, valueText, unitText, bar);
getChildren().setAll(pane);
}
private void addScoreKill(Point2D enemyPosition) {
inc("kills", +1);
if (geti("kills") == 15) {
set("kills", 0);
inc("multiplier", +1);
}
final int multiplier = geti("multiplier");
inc("score", +100*multiplier);
var shadow = new DropShadow(25, Color.WHITE);
Text bonusText = getUIFactoryService().newText("+100" + (multiplier == 1 ? "" : "x" + multiplier), Color.color(1, 1, 1, 0.8), 24);
bonusText.setStroke(Color.GOLD);
bonusText.setEffect(shadow);
var e = entityBuilder()
.at(enemyPosition)
.view(bonusText)
.buildAndAttach();
animationBuilder()
.onFinished(() -> e.removeFromWorld())
.interpolator(Interpolators.EXPONENTIAL.EASE_OUT())
.translate(e)
.from(enemyPosition)
.to(enemyPosition.subtract(0, 65))
.buildAndPlay();
animationBuilder()
.duration(Duration.seconds(0.35))
.autoReverse(true)
.repeat(2)
.interpolator(Interpolators.BOUNCE.EASE_IN())
.scale(e)
.from(new Point2D(1, 1))
.to(new Point2D(1.2, 0.85))
.buildAndPlay();
}