Проблемы кернинга при рисовании текста символ за символом - PullRequest
5 голосов
/ 03 января 2011

Я пытаюсь рисовать строки символ за символом, чтобы добавить световые эффекты к фигурам, составленным из текста.

while (i != line.length()) {
c = line.substring(i, i + 1);

cWidth = g.getFontMetrics().stringWidth(c);

g.drawString(c, xx += cWidth, yy);
i++;
}

Проблема в том, что ширина символа не является фактическим расстоянием, которое он рисует от другого символа, когда эти два символа печатаются в виде строки. Есть ли способ получить правильное расстояние в graphics2d?

Ответы [ 3 ]

2 голосов
/ 04 февраля 2011

Ответ Лукаса Барана решает основную проблему, которая, вероятно, приводила к тому, что ваши результаты выглядели плохо Тем не менее, остается более тонкая проблема, которую вы не можете повторить кернингом таким образом. Насколько это серьезная проблема, зависит от используемого вами шрифта. Чтобы сделать кернинг правильным, вы можете сделать что-то вроде этого:

while (i != line.length()) {
  String c = line.substring(i, i + 1);
  String d = line.substring(0, i + 1);
  int cWidth = g.getFontMetrics().stringWidth(c);
  int dWidth = g.getFontMetrics().stringWidth(d);
  g.drawString(c, xx + dWidth - cWidth, yy);
  i++;
}

Это должно разместить каждого персонажа там, где его поместил бы кернинг.

0 голосов
/ 23 января 2011

Проблема в том, что кернинг определяет интервал пар букв, а итерация по строке char-by-char не дает системе кернинга сработать. Я думаю, вам придется использоватьлибо шрифт с фиксированной шириной, либо переделайте свой эффект освещения, чтобы он работал с полными строками вместо одиночных символов.

0 голосов
/ 12 января 2011

Я не уверен, правильно ли я понял вашу проблему.Однако я проверил ваш код и действительно некоторые строковые символы перекрывали друг друга.

Проблема заключалась в том, что вы увеличивали значение xx (вы увеличивали его до рисования символа).

Вот исправленная версия вашего кода:

public void myDrawString(Graphics g, String line, int xx, int yy) {
    int i = 0;
    while (i != line.length()) {
        String c = line.substring(i, i + 1);
        int cWidth = g.getFontMetrics().stringWidth(c);
        g.drawString(c, xx, yy);
        xx += cWidth;
        //xx += 2;
        i++;
    }
}

Раскомментируйте и настройте строку xx += 2, чтобы увеличить расстояние между символами.

...