PDA

Просмотр полной версии : Как определить координаты курсора


руль
01.06.2002, 01:30
...Ну или на худой конец координаты последней буквы в Text field

Я програмно создаю текст-филд, тама пишу кой-какой текст и мне надо динамически отслеживать координаты курсора (х,у). Я тута перелопатил весь Хелп по флэшу но чет не наткунлся =(.Кто-нить знает возможно ли такое вообще ? (речь идет о ФлэшМХ естесенно)
Заранее благодарен.

Master-Bloodar
02.06.2002, 06:23
Координаты мыши можно определить зарезервированными переменными _xmouse и _ymouse. А вот, как определить координаты букв, не знаю.

руль
02.06.2002, 15:41
Хех, возможно я несколько некорректно поствил вопрос. Имелись ввиду координаты не того курсора который бегает за мышью а того которым мы пишем в текст-филд (ну палочка такая вертикальная, если видел кто =)

Nox Noctis
02.06.2002, 16:07
:)
this.createTextField("tst", 1, 10, 10, 0, 0);
tst.autoSize=true, tst.type="input", tst.variable="test";
noMargins = new TextFormat();
noMargins.leftMargin=0, noMargins.rightMargin=0;
tst.setTextFormat(noMargins);
_root.moveTo(10, 30);
tst.onChanged = function() {
_root.lineStyle(1);
_root.lineTo(10+this.textWidth, 30);
};
Selection.setFocus("test");
плюс к этому у текстового поля есть свойство _width, которое выдает ширину баундинг бокса инстанса...

все зависит от конкретной задачи:
например, можно брать Selection.getCaretIndex, загонять сабстринг до этого индекса в поле с авторесайзом и смотреть textWidth
...но наверняка для конкретного случая можно придумать более оптимальный способ...

зы: а в пятерке с рассчетом ширины такой геморрой был... вспомнить страшно...

руль
02.06.2002, 22:19
Вот мой конкретный случай:
Я прогрмано создаю текст-филд (параметры: Динамик-филд,авторесайз,мультилайн,вордврап), туда время от времени записывается различная чушь. Скрипт в этой чуши ищет сабстринги типа " =) " ну или " =( " и т.д. Далее не место этих смайлов вставляется мувиклип с соответсвующей рожой. Только вот определить координаты для него оказалось сложнее чем я думал.
ЗЫ
Метод который описан выше конечно хитёр, но думаю не совсем подходит тута....
ЗЫЫ
Интересно а возможно ли чисто теоретически определить ширину символов в 5-ке.Тама ведь для этого средствов совсем нету. Хотелось-бы по подробней углубится в т.н. геморрой =)

Nox Noctis
02.06.2002, 22:35
в пятерке он не "так называемый"... это он и есть во всей красе :D
там динамически рассчитать длину строки, набранной известным шрифтом можно только приблизительно... очень приблизительно...
даже если измерить в пикселях каждую букву шрифта...

по теме:
вообще, проще наверное текст побить на кусочки... чтобы между каждой парой смайлов было свое текстовое поле...

но можно попробовать так:

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

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


зы: а вообще я не спал давно... может зря таких сложностей нагородил :D :D

руль
03.06.2002, 01:04
Сразу хочу поблагодарить за столь опретивную реакцию на мои реплики :) .
Насчет сабжа дискуссии:

Вся запара уперается именно в то КАК ОПРЕДЕЛИТЬ СМЕЩЕНИЕ ОТНОСИТЕЛЬНО ЛЕВОГО КРАЯ СТРОКИ.
Смайл в полне может стоять после 3-4 строчек текста (не забываем у нас мультилайн), где-нибудь в середине строки. Если мы вставим текст в текст-филд от начала до смайла то в свой-ве textwidth у нас будет ДЛИНА САМОЙ ДЛИНОЙ СТРОЧКИ но вовсе не смещение от начала строки до смайла
Насчет смещения по вертикали - тута все бонально , т.к. сначала пишется часть текста до смайла, потом сама рожа, далее остаток текста...

Nox Noctis
03.06.2002, 01:56
все гениальное просто, обратное неверно :))

– ищешь индексОфом свою строку. (получаешь первый ее индекс)
– берешь сабстринг от нуля до этого индекса
– берешь ластИндексОф(chr(13)) от полученного сабстринга
– берешь сабстр от полученого в предыдущем пункте индекса
– с помощью авторесайзового поля без вордврапа определяешь ширину полученного поля.
– теперь находишь остаток от деления на ширину исходного поля
––– это и будет твое смещение !..

если кодом, то:

strt = MainString.indexOf("=)", current_index);
victim = MainString.substring(0, strt);
victim = victim.substr(victim.lastIndexOf(chr(13))+1);
// делаем тестовое поле
this.createTextField("tst", 1, 0, -100, 0, 0);
tst.autoSize=true, tst.type="dynamic", tst.variable="test";
noMargins = new TextFormat();
noMargins.leftMargin=0, noMargins.rightMargin=0;
tst.setTextFormat(noMargins);
// поле готово
test = victim;
OFFSET = tst.textWidth - int(tst.textWidth/MainTextfield._width)*MainTextfield._width;

:) что-то громоздко как-то... но должно работать ;)

руль
03.06.2002, 02:40
Ну что я могу сказать....ГЕНИАЛЬНО (хотя может и не совсем просто). Сделал вроде все пашет....СПАСИБА
зы
Идея конечно класная но способ не единственный.Можно слегка заоптимизировать =)