图层是在JavaFX canvas上合成图形的唯一方法吗?

时间:2018-08-22 14:36:02

标签: java canvas javafx graphics

我正在使用JavaFX中的GUI进行操作,该GUI需要在画布上合成大量对象(通常使用Alpha蒙版等)。

要在HTML5画布上进行比较,可以使用drawImage函数在DOM结构外部的临时画布对象的帮助下轻松完成此操作。例如,要在具有alpha蒙版的画布上绘制图像,我首先在临时画布上绘制图像,然后使用globalCompositeOperation = "destination-in"在蒙版上绘制(即blit)蒙版,然后使用来在原始画布上绘制临时画布复合模式source-over。临时画布可以为每个这样的操作重新使用。像馅饼一样简单。

但是,到目前为止,据我所知,在JavaFX中推荐的这样做的方法是使用分组层,即多个覆盖的画布节点,这些节点永远不会“变平”。

我也可以在HTML5中这样做,但是在我最近的项目中,这会导致几十个或几百个可见层,这显然是非常愚蠢的。我的方法给了我出色的表现。

话虽这么说,是否有合理的方法在JavaFX画布上执行相同的操作?我认为手动执行逐像素复制是一件麻烦的事。

我想念什么?我是否以错误的方式考虑JavaFX?

1 个答案:

答案 0 :(得分:1)

我以前在JavaFx和Android上做到过,但我不知道他们在HTML 5上做到过 反正
您可以像在HTML 5上一样进行操作,可以创建一个名为mainCanvas的画布,该画布包含另一个画布的完成版本,比如说tempCanvas在临时画布中绘制所需的内容并应用然后也需要蒙版,然后为画布拍摄快照(由于CanvasNode,因此可以使用此代码对其进行快照)

WritableImage writableImage = new WritableImage(mainCanvas.getWidth(), mainCanvas.getHeight());
tempCanvas.snapshot(null, writableImage);

GraphicsContext context = mainCanvas.getGraphicsContext2D();
context.drawImage(writableImage,mainCanvas.getWidth(), mainCanvas.getHeight());