Просмотр полной версии : Положение курсора в текстовом поле
BLOOD585
27.01.2011, 16:37
Здраствуйте уважаемые товарищи! На сцене текстовое поле. При нажатии на него мувик под текстовым полем прнимает координаты _xmouse, как бы указывая на расположение курсора(каретки) в текстовом поле. Далее мышку например сдвинули на пару букв и опять кликнули на текстовом поле и мувик опять должен принять координаты х мыши, как бы указывая на каретку. Собственно как такое моджно реализовать. Пробовал менять фокус и различные другие приемы. Можеть есть аналог SetSelection в AS2
Врядли такое можно реализовать стандартными способами. Чтоб получилось всё граматно, нужно узнавать ширину символов в текстовом поле + расстояние между ними. Таких инструментов нет.
Но выход есть всегда !
извращенский способ #1:
Можно жестоко извратиться и сделать своё убер универсальное текстовое поле, в котором каждая буква будет вводиться в отдельный контейнер. Тем самым можно будет вычислять кординаты для корретки. Тоесть изобрести велосипед, но по русский ! :)
извращенский способ #2:
Чтобы узнавать кординаты для корретки - создать пустой контейнер, в нём текстовое поле. Затем Циклом, перебираем все буквы в слове, вставляя их в контейнер, записывая, складывания их общей ширины. поочереди.
Неточный извращенский способ 3:
var tf = this.createTextField("tf", 1, 100, 100, 100, 20);
tf._width = 300;
tf._height = 300;
tf.multiline = true;
tf.wordWrap = true;
tf.type = "input";
tf.text = "Здраствуйте уважаемые товарищи! На сцене текстовое поле. При нажатии на него мувик под текстовым полем прнимает координаты _xmouse, как бы указывая на расположение курсора(каретки) в текстовом поле.";
var center = this.createEmptyMovieClip("center", 2);
center.lineStyle(1,0xFF0000);
center.moveTo(-5,0);
center.lineTo(5,0);
center.moveTo(0,-5);
center.lineTo(0,5);
this.onEnterFrame = function() {
if (eval(Selection.getFocus()) == tf) {
var origText = tf.text;
var origML = tf.multiline;
var origWW = tf.wordWrap;
var position = Selection.getCaretIndex();
tf.text = tf.text.substr(0, position);
var w = tf.textWidth;
var h = tf.textHeight;
var tformat = tf.getTextFormat();
var metrics_1 = tformat.getTextExtent(tf.text, tf._width);
center._y = tf._y+h-metrics_1.descent-metrics_1.ascent;
tf.multiline = false;
tf.wordWrap = false;
var metrics_2 = tformat.getTextExtent(tf.text, tf._width);
if (tf.textWidth>metrics_2.width) {
center._x = tf._x+tf.textWidth%metrics_2.width;
} else {
center._x = tf._x+tf.textWidth;
}
tf.text = origText;
tf.multiline = origML;
tf.wordWrap = origWW;
}
};
Метод SetSelection в AS2 есть.
Например:
this.createTextField("txt", 99, 10, 10, 200, 30);
txt.type = "dynamic";
txt.text = "this is my text";
this.onEnterFrame = function ()
{
var cp:Number = Selection.getBeginIndex();
Selection.setSelection(cp, cp + 1);
};
BLOOD585
28.01.2011, 10:20
Спасибо большое извращенского способо 3 вполне хватило)))))
BLOOD585
28.01.2011, 14:15
Итак возникла новая проблема)))
Чем длиннее текст тем больше отклонение, причем эта ошибка только у меня, в вашем примере все отлично работает! Может быть это из за шрифта?
Вот выложил исходник.
Нет, у автора сево кода тот-же косяк. :)
Вечерком попробую свой вариант набрать.
Про ошибку знаю, у меня она тоже проявляется. Но вот как сделать лучше — пока не решил. :)
BLOOD585
30.01.2011, 12:06
Более менее решил проблему так:
center._x = tf._x+tf.textWidth-tf.textWidth*0,07;
Чем больше ширина текста, тем больше отнимаем от координат. Для небольшого текстового поля, как у меня, ничего не заметно)))
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.