Я пытаюсь разместить точно короткий текст над изображением в Codename One. Я вычисляю место, где текст должен начинаться на основе его ширины, чтобы он выглядел по центру.Как точно получить ширину рисованной строки (в пикселях) с помощью Codename One?
Однако ширина текста, который я получаю от
myFont.stringWidth(myStringToMeasure);
всегда намного больше, чем фактический нарисованной текст (прямоугольник рисуется вокруг графика, где рисуется текст). Таким образом, текст не имеет никакого отношения к центру. Вот что я получаю от симулятора.
Я попытался суммировать ширину каждого полукокса в пределах MyString с
for (char c : myString.toCharArray()) {
stringWidth += myFont.charWidth(c);
}
но результат был еще больше, что предыдущий (почти в два раза больше).
Использовал ли я метод stringWidth неправильно? Есть ли способ надежно получить ширину рисованной строки?
NB: Я просто попробовал его на устройстве, и текст выглядел так, как ожидалось. Мне просто повезло, или он будет работать на других реальных устройствах?
EDIT 1:
Это странно, я знаю @Shai правильно, но я не могу заставить его работать! Если бы я просто бросить в его фрагменте кода в моем методе я получаю совершенно другой результат:
// width and height are the Graphics width and height that
// has been created via Image.createImage(myImage.getWidth(), myImage.getHeight())
public void paintOnBackground(Graphics g,
int width, int height) {
Font myFont = g.getFont();
g.setFont(myFont);
int w = myFont.stringWidth("Hi World");
int h = myFont.getHeight();
// Added just to see the background
g.setColor(0x0000FF);
g.fillRect(0, 0, width, height);
g.setColor(0xff0000);
// Because g.getTranslateX() is equivalent to getX() (not available here)
int x = g.getTranslateX() + width/2 - w/2;
int y = g.getTranslateY() + height/2 - h/2;
// The rectangle is centered
g.drawRect(x, y, w, h, 20); // large thickness to see it at a glance!
// The string is outside the rectangle
g.drawString("Hi World", x, y);
Я даже не получить @ результат Шая:
Любая идея, что я сделал не так?
EDIT 2: ОК, если я тестирую его на устройстве (Android 4.4), строка появляется, как при захвате экрана Shai. Итак, похоже, что проблема связана скорее с симулятором (все скины/Linux/Eclipse 4.5)! Кодекс Шая (и мой тоже действительно) хорошо работает на реальном устройстве.
EDIT 3: Проблема решена: Обновление проекта ЛИЭС от 114 до 115 исправили проблему => см this other SO question which was related
Любая помощь будет принята с благодарностью!
Приветствия
Благодаря @Shai. Я использую тот же объект шрифта, но я создаю шрифт ttf, например 'Font font = Font.createTrueTypeFont (myFontFeatures.get (" FontName_Name "), myFontFeatures.get (" FontName_Name ") +" .ttf "). Вывод (fontSize, styleName); '. Может быть, это причина, по которой я получаю иной результат, чем ваш? Я проверю, где-то я сделал ошибку. – HelloWorld
См. Обновленный ответ –
Спасибо Shai, я попробовал свой первый фрагмент кода. И даже с этим я получаю другой результат (см. Мое редактирование)! Возможно, я что-то что-то изменил, что ведет к такому поведению ... но я не знаю, что! – HelloWorld