我正在创建一个有2个相互重叠的矩形的健康栏。内部显示当前的健康状况,外部显示总体健康状况。
问题
健康栏很模糊。
到目前为止我已经得到了什么
我读过关于e的文章。 G。 having to add 0.5,但它只能部分地解决问题。
截图,顶部图像没有0.5,底部图像是0.5添加。
以下是代码:
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;
}
}
在我为调试目的应用缩放之后,显然透明笔划不被视为具有相同宽度的透明线,如带有颜色的笔划:
问题
我可以尝试使用画布的不同方法,但这些是影响您设置JavaFX应用程序的方式的一般性问题。
非常感谢。
答案 0 :(得分:2)
不要抓住填充物。我链接的问题解释了在像素上绘制线条(通过中间 - 占据整个像素),这意味着+0.5因为坐标在像素之间。
填充需要在整个像素上绘制到它们之间的空间。
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);
}