Показать сообщение отдельно
Старый 12.12.2006, 20:56
ALiEN_2OO6 вне форума Посмотреть профиль Отправить личное сообщение для ALiEN_2OO6 Найти все сообщения от ALiEN_2OO6
  № 7  
Ответить с цитированием
ALiEN_2OO6
 
Аватар для ALiEN_2OO6

Регистрация: Nov 2006
Сообщений: 25
Отправить сообщение для ALiEN_2OO6 с помощью ICQ
Очень полезный пост, на основе него сделал чат. Немного доработал, т.к. хотел что бы весь текст можно было выделить мышкой и скопировать.

Я не стал разбивать весь текст на отдельные строки, а поступил так:

При добавлении строки со смайлами в текстовое поле, я точно так же заменяю смайлики на пробел со стилем, а вот сам порядковый номер смайла (от самого начала текста) добавляю в массив arrayIco. т.е. у меня получается массив координат смайлов - вычесленные всего один раз - при добавлении строки! Это - самая долгая операция.

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

Код:
function showPictures(e){
	
	clearPictures();

	// вычисление строки в скролленом тексте. tf - TextField
	var i = tf.getLineOffset(tf.scrollV-1);
	var b = tf.getCharBoundaries(i); // первый символ в строке (х, у)

	// определить выводить ли картинку или нет
	for(var k =0; k<arrayIco.length; k++){

		var z = tf.getCharBoundaries(arrayIco[k].x);

		if(z != null ){
			
			if(z.y >= b.y && (z.y < (b.y+tf.height))){
				
				showPicture(z.x, (z.y-b.y), arrayIco[k].type);
				
			}
		}
	}				
}

function clearPictures(){
	while (pictures.numChildren>0) pictures.removeChildAt(0);
}

function showPicture(x, y, type){
	
	var pic:Sprite;
	switch (type){
		case "smile1":
			pic = new smile1();
			pic.x = x;
			pic.y = y;
			break;
		case "smile2":
			pic = new smile2();
			pic.x = x;
			pic.y = y;
			break;
		default:
			pic = new smile_default();
			pic.x = x+7;
			pic.y = y+1;
			break;
	}
 	pictures.addChild(pic);
	
}