PDA

Просмотр полной версии : Положение курсора в текстовом поле


BLOOD585
27.01.2011, 16:37
Здраствуйте уважаемые товарищи! На сцене текстовое поле. При нажатии на него мувик под текстовым полем прнимает координаты _xmouse, как бы указывая на расположение курсора(каретки) в текстовом поле. Далее мышку например сдвинули на пару букв и опять кликнули на текстовом поле и мувик опять должен принять координаты х мыши, как бы указывая на каретку. Собственно как такое моджно реализовать. Пробовал менять фокус и различные другие приемы. Можеть есть аналог SetSelection в AS2

Tails
27.01.2011, 16:44
Врядли такое можно реализовать стандартными способами. Чтоб получилось всё граматно, нужно узнавать ширину символов в текстовом поле + расстояние между ними. Таких инструментов нет.

Но выход есть всегда !
извращенский способ #1:
Можно жестоко извратиться и сделать своё убер универсальное текстовое поле, в котором каждая буква будет вводиться в отдельный контейнер. Тем самым можно будет вычислять кординаты для корретки. Тоесть изобрести велосипед, но по русский ! :)

извращенский способ #2:
Чтобы узнавать кординаты для корретки - создать пустой контейнер, в нём текстовое поле. Затем Циклом, перебираем все буквы в слове, вставляя их в контейнер, записывая, складывания их общей ширины. поочереди.

Hauts
27.01.2011, 20:56
Неточный извращенский способ 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;

}
};

mooncar
27.01.2011, 21:28
Метод 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 вполне хватило)))))

Tails
28.01.2011, 11:44
Обращайтесь

BLOOD585
28.01.2011, 14:15
Итак возникла новая проблема)))

Чем длиннее текст тем больше отклонение, причем эта ошибка только у меня, в вашем примере все отлично работает! Может быть это из за шрифта?

Вот выложил исходник.

Tails
28.01.2011, 16:12
Нет, у автора сево кода тот-же косяк. :)

Вечерком попробую свой вариант набрать.

Hauts
29.01.2011, 22:50
Про ошибку знаю, у меня она тоже проявляется. Но вот как сделать лучше — пока не решил. :)

BLOOD585
30.01.2011, 12:06
Более менее решил проблему так:

center._x = tf._x+tf.textWidth-tf.textWidth*0,07;

Чем больше ширина текста, тем больше отнимаем от координат. Для небольшого текстового поля, как у меня, ничего не заметно)))