Алгоритм для оценки текстовой ширины на основе содержания

Вы устанавливаете значение 10 каждый раз, сначала используйте значение split:

else if (key.keyCode == 40){
    mouse.style.top = parseInt(mouse.style.top.split("px")[0]) + 10 + "px";
}
11
задан John Topley 29 April 2009 в 16:09
поделиться

7 ответов

Большинство каркасов GUI предоставляют какой-либо способ для вычисления текстовых метрик для шрифтов на заданных устройствах вывода.

Используя, например, java.awt.FontMetrics , вы можете сделайте это:

import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics; 

public int measureText(Graphics g, String text) {
   g.setFont(new Font("TimesRoman", Font.PLAIN, 12));
   FontMetrics metrics = g.getFontMetrics();

   return metrics.stringWidth(text);
}

Не проверено, но вы поняли идею.


В .Net вы можете использовать метод Graphics.MeasureString . В C #:

private void MeasureStringMin(PaintEventArgs e)
{

    // Set up string.
    string measureString = "Measure String";
    Font stringFont = new Font("Arial", 16);

    // Measure string.
    SizeF stringSize = new SizeF();
    stringSize = e.Graphics.MeasureString(measureString, stringFont);

    // Draw rectangle representing size of string.
    e.Graphics.DrawRectangle(new Pen(Color.Red, 1), 0.0F, 0.0F, stringSize.Width, stringSize.Height);

    // Draw string to screen.
    e.Graphics.DrawString(measureString, stringFont, Brushes.Black, new PointF(0, 0));
}
15
ответ дан 3 December 2019 в 03:05
поделиться

You really have no way of knowing what browser, font settings, screen size etc the client is using. (OK, sometimes the request headers provide an indication, but really nothing consistent or reliable.)

So, I would:

  • display some sample text in Internet Explorer with default settings on a screen/window size of 1024x768 (this is generally the most common size)
  • take an average characters/line with this configuration and use that for your estimate.

I've generally found this "good enough", for example, for estimating the number of lines that some text will take up on a browser, in order to estimate how many adverts to show next to the text.

If it was really really crucial to you, then I can imagine a convoluted scheme whereby you initially send some Javascript to the client, which then takes a measurement and sends it back to your server, and you then use this information for future pages for that client. I can't imagine it's usually worth the effort, though.

2
ответ дан 3 December 2019 в 03:05
поделиться

Я думаю, вам следует выбрать одно из следующих решений:

  • Точное решение: Суммируйте ширину для каждого символа в строке (большинство API предоставят вам эту информацию)
  • Быстрая оценка : Возьмите максимальную или минимальную ширину и умножьте ее на количество символов.

Конечно, возможна некоторая смешанная оценка, но я думаю, что это слишком много усилий в неправильном направлении.

1
ответ дан 3 December 2019 в 03:05
поделиться

Для веб-приложения вы не можете (действительно) получить правильную оценку. Разные шрифты имеют разную ширину, так что это зависит не только от клиента (браузера) и его настроек масштабирования и DPI, но также от шрифтов, имеющихся на этом компьютере (и в операционной системе) или их замен.

Если вам нужен точный измеряя, создайте графический объект (растровое изображение, SVG, или даже какой-нибудь PDF-файл или что-то еще), который будет размещен на сервере, а не на клиенте.

Вы не можете (действительно) получить правильную оценку. Разные шрифты имеют разную ширину, так что это зависит не только от клиента (браузера) и его настроек масштабирования и DPI, но также от шрифтов, имеющихся на этом компьютере (и в операционной системе) или их замен.

Если вам нужен точный измеряя, создайте графический объект (растровое изображение, SVG, или даже какой-нибудь PDF-файл или что-то еще), который будет размещен на сервере, а не на клиенте.

Вы не можете (действительно) получить правильную оценку. Разные шрифты имеют разную ширину, так что это зависит не только от клиента (браузера) и его настроек масштабирования и DPI, но также от шрифтов, имеющихся на этом компьютере (и в операционной системе) или их замен.

Если вам нужен точный измеряя, создайте графический объект (растровое изображение, SVG, или даже какой-нибудь PDF-файл или что-то еще), который будет размещен на сервере, а не на клиенте.

2
ответ дан 3 December 2019 в 03:05
поделиться

Для хорошего * клиентского решения вы можете попробовать гибридный подход CSS-and-Javascript, как предложено в ответе RichieHindle на мой вопрос .

Учитывая, что Вы не знаете, каким шрифтом пользователь увидит страницу (они всегда могут переопределить ваш выбор, Ctrl- + страница и т. д.), «правильное» место для этого - браузер ... хотя браузеры этого не делают сделать это проще!

* когда я говорю «приятно», я имею в виду «возможно, хорошо, но я еще не пробовал»

1
ответ дан 3 December 2019 в 03:05
поделиться

На самом деле это попытка встроить некоторые смарты в метод усечения строки [...]

Действительно ли это стоит усилий? У нас была именно эта проблема. И это было на разных языках. Решением было оставить все как есть. Сложность поддержания этого интеллекта быстро увеличивается (и, вероятно, экспоненциально) с каждым языком, для которого вы добавляете поддержку. Отсюда и наше решение.

[...] алгоритм для оценки и категоризации ширины текста (для шрифта переменной ширины) на основе его содержимого?

Большинство библиотек шрифтов предоставят вам эту информацию. Но это довольно низкоуровневые вещи. Основная идея - передать строку и вернуть ширину в точках.

1
ответ дан 3 December 2019 в 03:05
поделиться

Не существует надежного серверного решения для расчета ширины текста. (вне создания изображения текста и, возможно, SVG)

Если вы попробуете инструмент, подобный браузерным снимкам , и запустите его на сравнительно простых страницах, вы сразу поймете, почему. Трудно предсказать, насколько широкими окажутся даже самые обыденные примеры, намного меньше, если пользователь решит увеличить масштаб в браузере и т. д.

Точно не указано, что вы, возможно, захотите обрезать строку (это может быть полезно при поиске потенциальных решений), но наиболее распространенным является то, что вы хотите вырезать в какой-то момент отключите текст и создайте эллипс.

Это можно надежно сделать на многих платформах браузеров с помощью свойства css и NO javascript:

http: //www.jide. fr / emulate-text-overflowellipsis-in-firefox-with-css

2
ответ дан 3 December 2019 в 03:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: