PDA

Просмотр полной версии : Эффект нажатия на слово в тексте, как сделать?


Andrew_J
03.08.2006, 23:53
Всем привет, вот пытаюсь придумать такую штуку с текстом.
Есть предложение, состоящее из нескольких строк. Нужно вывести это предложение на экран. Необходимо сделать чтобы при нажатии мышой на какое то из слов это слово выделилось, к примеру другим цветом и надо получить номер слова в предложении на которое произвелось нажатие в какую либо переменную.
Подскажите как тут поступить и какие возможны способы?

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

flash33
04.08.2006, 15:59
Сделай не текстовое поле а набор movieclip с единственным словом в нем.
рабей строку на массив и последовательно аттач мувики со следующими друг за другом словами, выдернутыми из массива. Создай в прототипе мувика свойство onPress которое бы выводило номер этого мувика и перекрашивало его в нужный цвет.. Вроде так

bbexp
04.08.2006, 17:04
Если поле - динамическое, со включенным selectable, то можно проверить на какой позиции стоит курсор (объект Selection, метод getCaretIndex).
Потом написать функцию, определяющую какое слово занимает такую позицию. Выяснив слово и определив его начальный и конечный индексы - применить TextFormat для переформатирования слова.

Если selectable = false; - то геморрой обеспечен.
Конечно можно выяснить какой высоты-ширины текстовое поле, какая гарнитура, попытатся определить длину каждого слова исходя из букв, его составляющих, но уверяю - это будет мерзкое занятие.

Тут действительно проще будет составить текст из муви Клипов, и на них уже вешать код.

KidsKilla
04.08.2006, 17:44
var txt = 'Всем привет, вот пытаюсь придумать такую штуку с текстом.';
txt += 'Есть предложение, состоящее из нескольких строк. Нужно вывести это предложение на экран. Необходимо сделать чтобы при нажатии мышой на какое то из слов это слово выделилось, к примеру другим цветом и надо получить номер слова в предложении на которое произвелось нажатие в какую либо переменную.';
txt += 'Подскажите как тут поступить и какие возможны способы?';
var _txt = this.createTextField('_txt', 0, 0, 0, 500,null);
_txt.html = true;
_txt.autoSize = true;
_txt.selectable = false;
_txt.wordWrap = true;
var arr = txt.split(' ');
var i = arr.length;
while(i--){
arr[i] = '<a href="asfunction:trace, '+i+'">'+arr[i]+'</a>';
}
txt = arr.join(' ');
_txt.htmlText = txt;

amphetamine
04.08.2006, 18:18
KidsKilla всех порвал =)

KidsKilla
04.08.2006, 18:21
KidsKilla всех порвал =)

function arr2html(arr) {
var a = arr.concat([])
var i = a.length;
while (i--) {
a[i] = '<a href="asfunction:fun, '+i+'">'+a[i]+'</a>';
}
return a.join(' ');
}
function fun(num:String):Void {
var a:Array = arr.concat([]);
var n:Number = parseInt(num);
trace('"'+a[n]+'": '+n)
a[n] = '<font color="#FF0000">'+a[n]+'</font>';
_txt.htmlText = arr2html(a);
}
var txt = 'Всем привет, вот пытаюсь придумать такую штуку с текстом.';
txt += 'Есть предложение, состоящее из нескольких строк. Нужно вывести это предложение на экран. Необходимо сделать чтобы при нажатии мышой на какое то из слов это слово выделилось, к примеру другим цветом и надо получить номер слова в предложении на которое произвелось нажатие в какую либо переменную.';
txt += 'Подскажите как тут поступить и какие возможны способы?';
var _txt = this.createTextField('_txt', 0, 0, 0, 500, null);
_txt.html = true;
_txt.autoSize = true;
_txt.selectable = false;
_txt.wordWrap = true;
var arr = txt.split(' ');
_txt.htmlText = arr2html(arr);


дубль2 рвём накуски. =)))

KUZEN
04.08.2006, 18:24
Как вариант

my_array = ["Вот", "такое", "вот", "предложение", "получается", "бла-бла-бла"];
F_createText = function () {
_root.createTextField("tf", 1, 10, 10, 530, 420);
with (tf) {
border = true;
html = true;
}
//
var len = my_array.length;
firstIndex = 0;
lastIndex = 0;
for (var i = 0; i<len; i++) {
lastIndex += my_array[i].length+1;
if (i != 0) {
firstIndex = lastIndex-my_array[i].length-1;
}
tf.htmlText += '<a href=\"asfunction:F_change,'+firstIndex+','+lastIndex+'\">'+my_array[i]+" </a>";
}
};
F_createText();
//
F_change = function (index) {
a = index.split(",");
//
var str = tf.text.substring(a[0], a[1]);
tf.replaceText(a[0], a[1], str.toUpperCase());
};

KidsKilla
04.08.2006, 18:34
Как вариант

my_array = ["Вот", "такое", "вот", "предложение", "получается", "бла-бла-бла"];
my_array = ("Вот такое вот предложение получается бла-бла-бла").split(' ');

кстати, в одинарных кавычках двойные экранировать не надо...

Andrew_J
04.08.2006, 19:31
Всё гениальное просто :eek:
Не думал, что можно было все так сделать без гемора на пару дней.

Спасибо вам друзья :drinks:

KidsKilla, расскажи секрет, почему слова начинают нажиматься как кнопки, и что значит эта строчка:
a[i] = '<a href="asfunction:fun, '+i+'">'+a[i]+'</a>';

flash33
04.08.2006, 19:41
вот еще накалякал, может подойдет?

Andrew_J
04.08.2006, 20:08
flash33, по функционалу то что надо, даже больше.
А исходничком заделиться?

flash33
04.08.2006, 20:47
Прочти внимательно мой первый пост и станет понятно. Немного модифицировал..

KidsKilla
05.08.2006, 18:01
KidsKilla, расскажи секрет, почему слова начинают нажиматься как кнопки, и что значит эта строчка:
a[i] = '<a href="asfunction:fun, '+i+'">'+a[i]+'</a>';
не как кнопки а как ссылки.
переводим текстовое поле в хтмл-понимающее
и каждое слово оборачиваем в ссылку:
a[i] = '<a href="asfunction:fun, '+i+'">'+a[i]+'</a>';

asfunction -- спец протокол флеша для вызова флешовых ф-ций из текстовых ссылок. в поиске по хелпу флеша найдёшь всё...

Andrew_J
05.08.2006, 20:23
KidsKilla, спасибо, разобрался про asfunction.

Только у меня появилась другая проблема, создаю вручную TextField с определенными параметрами, зетем програмно меняю с помощью TextFormat размер шрифта поля, а при нажатии на любое слово, размер сбрасывается в первоначальное состояние. И никак не могу это исправить, может кто знает из-за чего это?

KUZEN
06.08.2006, 23:43
делай програмно и не парься ;)