2016-06-21 1 views
1

Я пытаюсь разместить точно короткий текст над изображением в Codename One. Я вычисляю место, где текст должен начинаться на основе его ширины, чтобы он выглядел по центру.Как точно получить ширину рисованной строки (в пикселях) с помощью Codename One?

Однако ширина текста, который я получаю от

myFont.stringWidth(myStringToMeasure); 

всегда намного больше, чем фактический нарисованной текст (прямоугольник рисуется вокруг графика, где рисуется текст). Таким образом, текст не имеет никакого отношения к центру. Вот что я получаю от симулятора.

Part of the background image with the text over it (simulator)

Я попытался суммировать ширину каждого полукокса в пределах 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); 

Я даже не получить @ результат Шая:

Generated image that reflects what is on the simulator's screen (the grey background comes from Gimp)

Любая идея, что я сделал не так?

EDIT 2: ОК, если я тестирую его на устройстве (Android 4.4), строка появляется, как при захвате экрана Shai. Итак, похоже, что проблема связана скорее с симулятором (все скины/Linux/Eclipse 4.5)! Кодекс Шая (и мой тоже действительно) хорошо работает на реальном устройстве.

EDIT 3: Проблема решена: Обновление проекта ЛИЭС от 114 до 115 исправили проблему => см this other SO question which was related

Любая помощь будет принята с благодарностью!

Приветствия

ответ

1

Char ширина будет неточным, по определению, как символы могли бы быть сделаны по-разному в индивидуальном порядке.

ширина строки должна быть совершенно точным везде, используя тот же шрифт объекта:

Form f = new Form("Width", new BorderLayout()); 
f.add(BorderLayout.CENTER, new Component() { 

    @Override 
    protected void initComponent() { 
     super.initComponent(); 
     setUIID("Label"); 
    } 


    @Override 
    public void paint(Graphics g) { 
     Font myFont = getStyle().getFont(); 
     g.setFont(myFont); 
     int w = myFont.stringWidth("Hi World"); 
     int h = myFont.getHeight(); 
     g.setColor(0xff0000); 
     int x = getX() + getWidth()/2 - w/2; 
     int y = getY() + getHeight()/2 - h/2; 
     g.drawRect(x, y, w, h); 
     g.drawString("Hi World", x, y); 
    } 

}); 
f.show(); 

enter image description here

И с другим шрифтом ...

@Override 
protected void initComponent() { 
    super.initComponent(); 
    setUIID("Label"); 
    Font handleeFont = Font.createTrueTypeFont("Handlee", "Handlee-Regular.ttf"). 
        derive(Font.getDefaultFont().getHeight(), Font.STYLE_PLAIN); 
    Font handleeFontLarge = handleeFont.derive(handleeFont.getHeight() * 1.5f, Font.STYLE_PLAIN); 
    getUnselectedStyle().setFont(handleeFontLarge); 
} 

enter image description here

+0

Благодаря @Shai. Я использую тот же объект шрифта, но я создаю шрифт ttf, например 'Font font = Font.createTrueTypeFont (myFontFeatures.get (" FontName_Name "), myFontFeatures.get (" FontName_Name ") +" .ttf "). Вывод (fontSize, styleName); '. Может быть, это причина, по которой я получаю иной результат, чем ваш? Я проверю, где-то я сделал ошибку. – HelloWorld

+0

См. Обновленный ответ –

+0

Спасибо Shai, я попробовал свой первый фрагмент кода. И даже с этим я получаю другой результат (см. Мое редактирование)! Возможно, я что-то что-то изменил, что ведет к такому поведению ... но я не знаю, что! – HelloWorld

Смежные вопросы