Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 1.0/2.0 (http://www.flasher.ru/forum/forumdisplay.php?f=93)
-   -   Координаты строк текста - как найти? (http://www.flasher.ru/forum/showthread.php?t=130303)

Vasyaga 23.09.2009 07:54

Координаты строк текста - как найти?
 
У меня есть текстовое multiline-полe (TextField). В нём - разного рода текст (может отличаться шрифт, цвет, размер и. т. д.), разбитый на линии. Мне хотелось бы четко узнать координаты и высоту каждой линии текста. Использовал TextFormat.getTextExtent() для каждой линии, пробовал также разбивать на кусочки с отличающимся TextFormat-ом, а потом считать максимальные значения - все не работает. Накапливается какая-то ошибка, начиная со второй линии текста.
Пробовал использовать класс TextMetrics: http://blog.greensock.com/textmetrics/ Однако он работает только для одинаковых шрифтов/размеров...

Может кто сталкивался? Помогите, плиз... Заранее благодарен.

marat_sa 23.09.2009 08:42

переходите на AS3

Vasyaga 23.09.2009 08:50

Цитата:

Сообщение от marat_sa (Сообщение 852775)
переходите на AS3

Не подходит :)

marat_sa 23.09.2009 08:56

Тогда даже не знаю что и посоветовать...
Делал чат на AS2 давно, тоже чего только не перепробовал... Но сделал))
А вам для чего?

Vasyaga 23.09.2009 09:03

Мне нужно конвертировать содержимое TextField в SVG-формат, а SVG не поддерживает многострочный текст, т.е. нужно выводить каждую строку отдельно.

marat_sa 23.09.2009 09:29

не знаю, ссори :(

iNils 23.09.2009 11:32

Цитата:

а SVG не поддерживает многострочный текст, т.е. нужно выводить каждую строку отдельно.
Так вам нужны координаты строк или содержимое?

Vasyaga 23.09.2009 11:44

Мне всё нужно, но главное - это координаты левого верхнего угла строки, чтобы на каждую строку в TextField можно было создавать элемент <text> в SVG. Соответственно, если строка содержит несколько отличающихся форматов, то я использую <tspan> внутри <text>. Для single line TextField всё написано и работает, а теперь захотелось использовать многострочный текст. Поэтому-то мне и нужны координаты левых верхних углов строк, их ширина и высота.

iNils 23.09.2009 12:06

Снимаете битмапдату, выделяете первый символ, снимаете еще одну битмапу, теперь анализируете пиксели первой и второй битмапы и находите верхний левый и нижний левый угол. Продолжаете выделять символы от первого до n, пока не определите, что произошел перевод строки. Ну и тд.

dimarik 23.09.2009 12:13

Вдогонку к посту iNils'а.
Используйте BitmapData#getColorBoundsRect для уточнения координат.

Vasyaga 23.09.2009 12:15

Ну, с битмапдатой слишком уж жестко :) К тому же ведь есть же getTextExtent. Только почему-то он некорректно работает...
Хочу попробовать такой вариант:
1. Построчно добавляю текст и снимаю метрики (getTextExtent) для каждой строки
2. Отслеживаю изменения высоты TextField и textHeight.
3. Смотрю на сколько они отличаются от суммы рассчитанных при помощи getTextExtent и прибавляю/отнимаю к/от текущей координаты.

Попробую и по результатам отпишусь. По-прежнему приветствую любые другие идеи. Должен ведь быть способ!

Добавлено через 4 минуты
Вдогонку к битмапдате - строка фактически может начинаться раньше, чем первый пиксел, поскольку ее высота зависит от шрифта. Например - текст содержит только строчные буквы и если я буду анализировать их, то координата уплывет вниз, т.к. по-настоящему y-координата строки будет находиться выше! (Надеюсь понятно объяснил)

iNils 23.09.2009 13:26

Цитата:

(Надеюсь понятно объяснил)
Не понятно.

Psycho Tiger 23.09.2009 13:33

Если я правильно понял, то
Код:

БАВГ
АБВГ
аБВГ

левый верхний пиксель только в 1 варианте будет залит, в остальных двух он будет пустой.

Vasyaga 23.09.2009 13:43

Psycho Tiger - совершенно верно, только построчно, т.е. анализировать будем сверху-вниз:
Код:

аааа
АаАа

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

iNils 23.09.2009 15:10

Вложений: 1
Цитата:

Если анализировать BitmapData этих двух строк, то высота первой будет меньше,
Не будет. Вы должны анализировать не сам текст, а выделение текста. Как видите, высота черного блока и вверху и внизу 66 пикселей.

Vasyaga 23.09.2009 15:22

Цитата:

Сообщение от iNils (Сообщение 852896)
Вы должны анализировать не сам текст, а выделение текста.

Отличная идея! Спасибо. Как-то не додумывался анализировать выделение. Возьму на заметку.

iNils 23.09.2009 15:25

Я сразу об этом написал: "выделяете первый символ"

Vasyaga 09.10.2009 08:37

iNils - благодарю за совет, всё заработало. В случае если стандартные методы получения метрик текста не помогают - действительно можно пользоваться BitmapData для попиксельного анализа.


Часовой пояс GMT +4, время: 09:58.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.