捕捉像素并避免模糊的一般机制

时间:2015-01-27 04:36:18

标签: javafx blur

我正在创建一个有2个相互重叠的矩形的健康栏。内部显示当前的健康状况,外部显示总体健康状况。

问题

健康栏很模糊。

到目前为止我已经得到了什么

我读过关于e的文章。 G。 having to add 0.5,但它只能部分地解决问题。

截图,顶部图像没有0.5,底部图像是0.5添加。

enter image description here

以下是代码:

private class HealthBar extends Pane {

    Rectangle outerHealthRect;
    Rectangle innerHealthRect;

    public HealthBar() {

        double height = 10;

        double outerWidth = 60;
        double innerWidth = 40;

        // using 0.5, otherwise it would be blurry
        double x=snap( 0.0);
        double y=snap( 0.0);

        outerHealthRect = new Rectangle( x, y, outerWidth, height);
        outerHealthRect.setStroke(Color.BLACK);
        outerHealthRect.setFill(Color.WHITE);

        innerHealthRect = new Rectangle( x, y, innerWidth, height);
        innerHealthRect.setStroke(Color.TRANSPARENT);
        innerHealthRect.setFill(Color.LIMEGREEN);

        getChildren().addAll( outerHealthRect);
        getChildren().addAll( innerHealthRect);

    }

    public void setValue( double value) {
        innerHealthRect.setWidth( snap( outerHealthRect.getWidth() * value));
    }

    private double snap( double value) {
        return (int) value + 0.5;
    }
}

在我为调试目的应用缩放之后,显然透明笔划不被视为具有相同宽度的透明线,如带有颜色的笔划:

enter image description here

问题

  • 是否有捕捉像素的选项,i。即一般都有清晰的像素而不必乱用0.5?
  • 如何使透明笔划与外笔划的宽度相同?

我可以尝试使用画布的不同方法,但这些是影响您设置JavaFX应用程序的方式的一般性问题。

非常感谢。

1 个答案:

答案 0 :(得分:2)

不要抓住填充物。我链接的问题解释了在像素上绘制线条(通过中间 - 占据整个像素),这意味着+0.5因为坐标在像素之间。

填充需要在整个像素上绘制到它们之间的空间。

enter image description here

public HealthBar() {

    double height = 10;

    double outerWidth = 60;
    double innerWidth = 40;

    double x=10,y=10;//away from pane edge just to see better

    outerHealthRect = new Rectangle( snap(x), snap(y), outerWidth, height);
    outerHealthRect.setStroke(Color.BLACK);
    outerHealthRect.setFill(Color.WHITE);

    //just move green bar right a bit to see edges
    //and move it down 1 pix so it's not over the black edge
    //this means height is -1 as well
    innerHealthRect = new Rectangle( x+11, y+1, innerWidth, height-1);
    innerHealthRect.setFill(Color.LIMEGREEN);
    //no need to draw transparent anything

    getChildren().addAll( outerHealthRect);
    getChildren().addAll( innerHealthRect);

}