尺度过渡破坏内部阴影

scale transition ruins inner shadow

内阴影在过渡过程中消失,看起来内阴影也被缩放了。

public void showTowerRange(int x0, int y0, double range) {
    Circle circle = new Circle(
            x0 * MAP_CELLS_WIDTH + MAP_CELLS_WIDTH / 2,
            y0 * MAP_CELLS_HEIGHT + MAP_CELLS_HEIGHT / 2,
            1,
            Color.RED
    );
    circle.setOpacity(0.5);
    gameRoot.getChildren().add(circle);

    ScaleTransition scl = new ScaleTransition(Duration.millis(SHOW_RANGE_EFFECT_DURATION),circle);
    scl.setByX(range * MAP_CELLS_WIDTH);
    scl.setByY(range * MAP_CELLS_HEIGHT);

    FadeTransition fd = new FadeTransition(Duration.millis(SHOW_RANGE_EFFECT_DURATION),circle);
    fd.setByValue(-.3);

    circle.setEffect(new InnerShadow(BlurType.GAUSSIAN, Color.GREEN, 4, 1, 0, 0));
    circle.setEffect(new DropShadow(BlurType.GAUSSIAN, Color.WHITE, 2, 0, 0, 0));
    ParallelTransition prl = new ParallelTransition(scl,fd);
    prl.play();
}

好吧,我有好消息也有坏消息要告诉你。良好的单尺度过渡不会破坏内部阴影。坏的-是你毁了内心的阴影:)
关键是,setEffect() 方法并没有添加其他效果,它只是设置节点的效果 属性,替换之前的值。您需要做的是链接您的效果(参见示例 here)。所以不是这个:

circle.setEffect(new InnerShadow(BlurType.GAUSSIAN, Color.GREEN, 4, 1, 0, 0));
circle.setEffect(new DropShadow(BlurType.GAUSSIAN, Color.WHITE, 2, 0, 0, 0));

你必须这样做:

InnerShadow is = new InnerShadow(BlurType.GAUSSIAN, Color.GREEN, 4, 1, 0, 0);
DropShadow ds = new DropShadow(BlurType.GAUSSIAN, Color.WHITE, 2, 0, 0, 0);
ds.setInput(is);
circle.setEffect(ds);