【发布时间】:2016-02-14 03:42:16
【问题描述】:
GraphicsContext 的 clearRect 方法的文档说明它使用当前剪辑,但这目前不适用于我。考虑:
GraphicsContext context = canvas.getGraphicsContext2D();
context.beginPath();
context.rect(0,0,100,100); //Set the current path to a rectangle
context.stroke(); //Highlights where the current path is
context.clip(); //Intersect current clip with rectangle
context.fillOval(80, 80, 40, 40); //This correctly draws the oval clipped
context.clearRect(0,0,100,100); //This does nothing at all
上面的代码正确地设置了剪辑掩码,这一事实证明了 fillOval 可以正常工作,但是 clearRect 什么也不做(尽管它在没有 context.clip() 的情况下正常工作)。为什么是这样?
(请注意,我特别需要剪辑蒙版才能正常工作,因为稍后我计划将其设置为特定形状以擦除非矩形形状。)
-- 编辑--
明确地说, clearRect 实际上什么都不做,甚至不擦除椭圆。我意识到它不会删除描边的矩形,但这不是我关心的。
-- 编辑 2--
更新到最新的 JDK 已部分解决了该问题。上面的代码现在可以正常工作了。但是,使用非矩形剪辑蒙版仍然存在同样的问题。例如
GraphicsContext context = canvas.getGraphicsContext2D();
context.beginPath();
context.arc(50, 50, 40, 40, 0, 360); // Make a circular clip mask
context.closePath();
context.clip();
context.fillRect(0, 0, 200, 200); //Draw a circle clipped correctly, shows clip mask is working
context.clearRect(0, 0, 200, 200); //Does nothing
我意识到我可以使用 save 和 restore 来取回一个矩形剪辑蒙版,然后 clearRect 就可以了。但是我希望能够擦除非矩形形状。
重现此的完整代码是(通过在 eclipse 中创建一个新的 JavaFX 项目并添加上述行来创建):
public class Main extends Application {
@Override
public void start(Stage primaryStage) {
try {
BorderPane root = new BorderPane();
Scene scene = new Scene(root, 400, 400);
primaryStage.setScene(scene);
primaryStage.show();
Canvas canvas = new Canvas(500, 500);
root.getChildren().add(canvas);
GraphicsContext context = canvas.getGraphicsContext2D();
context.beginPath();
context.arc(50, 50, 40, 40, 0, 360);
context.closePath();
context.clip();
context.fillRect(0, 0, 200, 200);
context.clearRect(0, 0, 200, 200);
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
launch(args);
}
}
这应该显示一个空白屏幕,但圆圈没有被清除。
【问题讨论】: