我需要画一个以一定百分比填充的圆。我试过了弧线,但这只是在怪异地切圆。最终结果应类似于this。当我什至不能画一个x%的实心圆时,我不知道该怎么做。我可以通过堆叠彩色和白色圆圈画出我想要的其余部分,但是如果我必须怪异地切割顶层,那就没用了。
我尝试过的代码:
int tx=300;
int ty=200;
int tr=100;
PdfCanvas canvas1 = new PdfCanvas(pdfPage);
canvas1.setColor(Color.GRAY, true);
canvas1.circle(tx, ty, tr);
canvas1.fill();
PdfCanvas canvas11 = new PdfCanvas(pdfPage);
canvas11.setColor(Color.WHITE, true);
canvas11.circle(tx, ty, tr-10);
canvas11.fill();
PdfCanvas canvas2 = new PdfCanvas(pdfPage);
canvas2.setColor(Color.GREEN, true);
canvas2.arc(tx-tr-10, ty-tr-10, tx+tr+10, ty+tr+10,90,87);//87 is just for testing
//canvas2.circle(tx, ty, tr+20);
canvas2.fill();
PdfCanvas canvas22 = new PdfCanvas(pdfPage);
canvas22.setColor(Color.WHITE, true);
canvas22.circle(tx, ty, tr-20);
canvas22.fill();
答案 0 :(得分:1)
首先,我看到您正在使用iText 7.0.x
版本(因为颜色常量在Color
类中),而7.1.x
已经存在了已经有一段时间了,7.1.4
是目前的最新版本。我建议您尽早切换到项目中的新行,因为这是当前正在积极维护的版本行。在7.0和7.1之间,API的差别很小,但是在您的情况下,您将不得不使用ColorConstants
类而不是Color
。
也无需每次都创建新的PdfCanvas
实例。您可以使用一个实例。如果需要,您可以调用saveState()
和restoreState()
,以便您设置颜色,线宽等仅适用于保存和恢复状态之间的操作。
您使用PdfCanvas#arc
的方法实际上是有效的方法,但是您需要研究抚摸弧度而不是填充弧度。如果我稍微修改一下代码:
int centerX = 300;
int centerY = 200;
int radius = 100;
float fillPercent = 80;
float circleThickness = 10;
float arcThickness = 15;
PdfCanvas canvas = new PdfCanvas(pdfPage);
canvas.setFillColor(ColorConstants.GRAY);
canvas.circle(centerX, centerY, radius);
canvas.fill();
canvas.setFillColor(ColorConstants.WHITE);
canvas.circle(centerX, centerY, radius - circleThickness);
canvas.fill();
canvas.setStrokeColor(ColorConstants.GREEN);
canvas.setLineWidth(arcThickness);
canvas.arc(centerX - radius + circleThickness / 2, centerY - radius + circleThickness / 2,
centerX + radius - circleThickness / 2, centerY + radius - circleThickness / 2, 90, -fillPercent / 100 * 360.);
canvas.stroke();
我可以达到以下效果: