停止 JavaFX LinearGradient 中的不透明度
Stop opacity in JavaFX LinearGradient
我有以下 SVG 文档:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg id="svg602"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
width="324.02335" height="689.724"
space="preserve" version="1.0">
<defs id="defs604">
<linearGradient id="linearGradient3034">
<stop id="stop3035" offset="0"
style="stop-color:#0000ff;stop-opacity:1" />
<stop id="stop3036" offset="1"
style="stop-color:#ffffff;stop-opacity:0;" />
</linearGradient>
<linearGradient id="linearGradient3542"
xlink:href="#linearGradient3034"
x1="10" y1="10"
x2="210" y2="210"
gradientUnits="userSpaceOnUse" />
</defs>
<rect id="r1" x="10" y="10" width="200" height="200"
style="fill:url(#linearGradient3542);stroke:none" />
</svg>
我正在尝试使用以下代码在 JavaFX 中实现相同的目的:
import javafx.application.Application;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.paint.Color;
import javafx.scene.paint.CycleMethod;
import javafx.scene.paint.LinearGradient;
import javafx.scene.paint.Stop;
import javafx.scene.shape.Rectangle;
import javafx.stage.Stage;
public class GradientSample extends Application {
public static void main(String[] args) { launch(args); }
@Override
public void start(Stage primaryStage) {
Group mainGroup = new Group();
Rectangle r = new Rectangle(10, 10, 200, 200);
Stop[] stops = new Stop[] { new Stop(0, new Color(0.0, 0.0, 1.0, 1.0)),
new Stop(1, new Color(1.0, 1.0, 1.0, 0.0)) };
LinearGradient lg = new LinearGradient(10, 10, 210, 210, false, CycleMethod.NO_CYCLE,
stops);
r.setFill(lg);
mainGroup.getChildren().add(r);
Scene scene = new Scene(mainGroup, 600, 600);
primaryStage.setScene(scene);
primaryStage.show();
}
}
然而,SVG 是这样渲染的(在 Inkscape 中):
JavaFX 场景呈现如下:
很明显,第二站的stop opacity(0.0)是JavaFX没有考虑的(如果我在SVG文件中设置opacity为1.0,渲染的跟JavaFX场景一样)
我是不是漏掉了什么或者我应该将其视为一个错误?
是否有任何其他解决方案如何在 JavaFX 中实现 Stop 的不透明度,而不是 1.0?
您确实发现了一个错误,但不在不透明度中!
我首先检查了不透明度是否有效。例如,您可以在矩形下方放置一些标签,您会看到它,所以这不是问题。
然后我将图像导出为 png,并对其进行了编辑。我发现不透明度很好地从 1 插值到 0,从左上角到右下角。
令我惊讶的是,红色和绿色在每个像素上都是 0!!
试图找到报告的错误,我没有找到任何错误,但我想到了使用不同的渲染管道。
将-Dprism.order
与选项d3d
(Windows)、es2
(Mac)和sw
一起使用,都给出了相同的结果错误的结果。但是旧的和弃用的 j2d
在 Windows!
上运行良好
为了检查它,我稍微修改了你的代码:
public void start(Stage primaryStage) {
Group mainGroup = new Group();
Rectangle r = new Rectangle(0, 0, 200, 200);
Stop[] stops = new Stop[] { new Stop(0, new Color(0.0, 0.0, 1.0, 1.0)),
new Stop(1, new Color(1.0, 1.0, 1.0, 0.0)) };
LinearGradient lg = new LinearGradient(0, 0, 1, 1, true, CycleMethod.NO_CYCLE, stops);
r.setFill(lg);
mainGroup.getChildren().add(r);
Scene scene = new Scene(mainGroup, 200, 200);
scene.setFill(Color.TRANSPARENT);
primaryStage.setScene(scene);
primaryStage.show();
WritableImage image = scene.snapshot(null);
PixelReader pixelReader = image.getPixelReader();
System.out.println("Color: " + pixelReader.getColor((int)image.getWidth()/2, (int)image.getHeight()/2));
}
运行 常规管道你会看到这个结果:
Color: 0x0000ff7f
而且只有 运行 -Dprism.order=j2d
你会得到:
Color: 0x7e7eff7f
正如我之前提到的,不透明度是插值的,但不是 RGB 颜色:在这种情况下,RGB 似乎是第一个停止点的颜色。
所以我们可能会想到在某个时候应该报告的回归。
我有以下 SVG 文档:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg id="svg602"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
width="324.02335" height="689.724"
space="preserve" version="1.0">
<defs id="defs604">
<linearGradient id="linearGradient3034">
<stop id="stop3035" offset="0"
style="stop-color:#0000ff;stop-opacity:1" />
<stop id="stop3036" offset="1"
style="stop-color:#ffffff;stop-opacity:0;" />
</linearGradient>
<linearGradient id="linearGradient3542"
xlink:href="#linearGradient3034"
x1="10" y1="10"
x2="210" y2="210"
gradientUnits="userSpaceOnUse" />
</defs>
<rect id="r1" x="10" y="10" width="200" height="200"
style="fill:url(#linearGradient3542);stroke:none" />
</svg>
我正在尝试使用以下代码在 JavaFX 中实现相同的目的:
import javafx.application.Application;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.paint.Color;
import javafx.scene.paint.CycleMethod;
import javafx.scene.paint.LinearGradient;
import javafx.scene.paint.Stop;
import javafx.scene.shape.Rectangle;
import javafx.stage.Stage;
public class GradientSample extends Application {
public static void main(String[] args) { launch(args); }
@Override
public void start(Stage primaryStage) {
Group mainGroup = new Group();
Rectangle r = new Rectangle(10, 10, 200, 200);
Stop[] stops = new Stop[] { new Stop(0, new Color(0.0, 0.0, 1.0, 1.0)),
new Stop(1, new Color(1.0, 1.0, 1.0, 0.0)) };
LinearGradient lg = new LinearGradient(10, 10, 210, 210, false, CycleMethod.NO_CYCLE,
stops);
r.setFill(lg);
mainGroup.getChildren().add(r);
Scene scene = new Scene(mainGroup, 600, 600);
primaryStage.setScene(scene);
primaryStage.show();
}
}
然而,SVG 是这样渲染的(在 Inkscape 中):
JavaFX 场景呈现如下:
很明显,第二站的stop opacity(0.0)是JavaFX没有考虑的(如果我在SVG文件中设置opacity为1.0,渲染的跟JavaFX场景一样)
我是不是漏掉了什么或者我应该将其视为一个错误?
是否有任何其他解决方案如何在 JavaFX 中实现 Stop 的不透明度,而不是 1.0?
您确实发现了一个错误,但不在不透明度中!
我首先检查了不透明度是否有效。例如,您可以在矩形下方放置一些标签,您会看到它,所以这不是问题。
然后我将图像导出为 png,并对其进行了编辑。我发现不透明度很好地从 1 插值到 0,从左上角到右下角。
令我惊讶的是,红色和绿色在每个像素上都是 0!!
试图找到报告的错误,我没有找到任何错误,但我想到了使用不同的渲染管道。
将-Dprism.order
与选项d3d
(Windows)、es2
(Mac)和sw
一起使用,都给出了相同的结果错误的结果。但是旧的和弃用的 j2d
在 Windows!
为了检查它,我稍微修改了你的代码:
public void start(Stage primaryStage) {
Group mainGroup = new Group();
Rectangle r = new Rectangle(0, 0, 200, 200);
Stop[] stops = new Stop[] { new Stop(0, new Color(0.0, 0.0, 1.0, 1.0)),
new Stop(1, new Color(1.0, 1.0, 1.0, 0.0)) };
LinearGradient lg = new LinearGradient(0, 0, 1, 1, true, CycleMethod.NO_CYCLE, stops);
r.setFill(lg);
mainGroup.getChildren().add(r);
Scene scene = new Scene(mainGroup, 200, 200);
scene.setFill(Color.TRANSPARENT);
primaryStage.setScene(scene);
primaryStage.show();
WritableImage image = scene.snapshot(null);
PixelReader pixelReader = image.getPixelReader();
System.out.println("Color: " + pixelReader.getColor((int)image.getWidth()/2, (int)image.getHeight()/2));
}
运行 常规管道你会看到这个结果:
Color: 0x0000ff7f
而且只有 运行 -Dprism.order=j2d
你会得到:
Color: 0x7e7eff7f
正如我之前提到的,不透明度是插值的,但不是 RGB 颜色:在这种情况下,RGB 似乎是第一个停止点的颜色。
所以我们可能会想到在某个时候应该报告的回归。