itext7 нарисовать% заполненный круг - PullRequest
0 голосов
/ 04 января 2019

Мне нужно нарисовать круг, заполненный на определенный%. Я попробовал дугу, но это просто странно разрезать круг. Конечный результат должен выглядеть примерно так: this . Понятия не имею, как мне это сделать, когда я даже не могу нарисовать заполненный х% круг. Я могу нарисовать остальное, что хочу, просто сложив цветные и белые кружки, но это бесполезно, если мне придется странно резать верхний слой.

Код из того, что я пробовал:

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();

1 Ответ

0 голосов
/ 05 января 2019

Прежде всего, я вижу, что вы используете версию iText 7.0.x (из-за того, что цветовые константы находятся в классе Color), в то время как 7.1.x уже давно существует и 7.1.4 является последней версией на данный момент. Я рекомендую вам переключиться на новую строку как можно раньше в проекте, потому что эта строка версии активно поддерживается в данный момент. Разница в API очень мала между 7.0 и 7.1, но в вашем случае вам придется использовать класс 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();

Я могу добиться следующего результата:

resultant arc

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...