Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 20.08.2009, 02:47
DARIUS1 вне форума Посмотреть профиль Отправить личное сообщение для DARIUS1 Найти все сообщения от DARIUS1
  № 1  
Ответить с цитированием
DARIUS1
 
Аватар для DARIUS1

Регистрация: Jul 2009
Сообщений: 50
Cool Как сделать смайлы на AS3?

Помогите пожалуйста)

Как сделать смайлы на AS3?

Делаю чат! Незнаю как сделать смайлы!
Эта методика мне не помогла! http://www.delphimaster.ru/articles/flash/index.html
Надо придумать как сделать чтобы в динамическом поле текста т.е. в самом чате
это "=)" заменялось этим то есть текст определённой картинкой! И конечно же я не знаю как сделать так чтобы смайл был ровно в строчке и его можно было вставлять между текста!

Старый 20.08.2009, 02:55
wvxvw вне форума Посмотреть профиль Отправить личное сообщение для wvxvw Найти все сообщения от wvxvw
  № 2  
Ответить с цитированием
wvxvw
Modus ponens
 
Аватар для wvxvw

модератор форума
Регистрация: Jul 2006
Адрес: #1=(list #1#)
Сообщений: 8,049
Записей в блоге: 38
Идти сюда и качать примеры:
http://labs.adobe.com/technologies/textlayout/
__________________
Hell is the possibility of sanity

Старый 20.08.2009, 04:50
DARIUS1 вне форума Посмотреть профиль Отправить личное сообщение для DARIUS1 Найти все сообщения от DARIUS1
  № 3  
Ответить с цитированием
DARIUS1
 
Аватар для DARIUS1

Регистрация: Jul 2009
Сообщений: 50
Цитата:
Сообщение от wvxvw Посмотреть сообщение
Идти сюда и качать примеры:
http://labs.adobe.com/technologies/textlayout/
СПАСИБО) Text Layout Framework Inline Images это вроде то что нужно! а как сделать саму функцию замены текста ?


Последний раз редактировалось DARIUS1; 20.08.2009 в 04:53.
Старый 20.08.2009, 14:23
Obi вне форума Посмотреть профиль Отправить личное сообщение для Obi Найти все сообщения от Obi
  № 4  
Ответить с цитированием
Obi
 
Аватар для Obi

Регистрация: Nov 2007
Адрес: Moscow
Сообщений: 566
Строго говоря, задача состоит в том, чтобы полученный хмл вида:
Код:
<flow:TextFlow whiteSpaceCollapse="preserve" xmlns:flow="http://ns.adobe.com/textLayout/2008">
   <flow:p>
      <flow:span>Привет, Мальчики :)</flow:span>
   </flow:p>
</flow:TextFlow>
привести к виду:
Код:
<flow:TextFlow whiteSpaceCollapse="preserve" xmlns:flow="http://ns.adobe.com/textLayout/2008">
   <flow:p>
      <flow:span>Привет, Мальчики </flow:span><flow:img height="auto" width="auto" source="smile.png"/>
   </flow:p>
</flow:TextFlow>
Собственно берем список смайлов
Код:
smiles({smile:':)', source:'smile.png'}, {smile:';)', source:'smile2.png'})
и дальше начинаются проблемы. А проблемы начинаются, благодаря тому, что в tlf существует строгая иерархия элементов, например вот так быть не может:

Код:
<flow:span>Привет, мальчики <flow:img height="auto" width="auto" source="smile.png"/></flow:span>
Поскольку span низший по иерархии элемент, внутри него кроме текста ничего быть не может.
Значит просто преобразовать хмл в строку и пройтись циклом, заменяя все
Код:
:)
на
Код:
<flow:img height="auto" width="auto" source="smile.png"/>
не выйдет.

Я решал эту проблему следующим образом:

На входе у нас имеется xml:
Код:
<flow:TextFlow whiteSpaceCollapse="preserve" xmlns:flow="http://ns.adobe.com/textLayout/2008">
   <flow:p>
      <flow:span>Привет ;) Мальчики :)</flow:span>
   </flow:p>
   <flow:p>
      <flow:span>Как у вас дела? :)</flow:span>
   </flow:p>
</flow:TextFlow>
Сначала пишем метод, который ищет в строке смайлы по шаблону, и возвращает массив их позиций в строке. Это нужно для того, чтобы знать как разбивать строку на несколько хмл-элементов, т.е. как из
Код:
Привет ;) Мальчики :)
Сделать
Код:
<flow:span>Привет </flow:span><flow:img height="auto" width="auto" source="smile2.png"/>;)<flow:span> Мальчики </flow:span><flow:img height="auto" width="auto" source="smile.png"/>:)
Код AS3:
/**
 * Ищет в строке смайлы, и возвращает массив с их порядковыми номерами.
 *
 * @param	str     Строка, с которой работаем, без разметки.
 * @param	smiles Список смайликов, например [{smile:':)', source:'smile.png'}, {smile:';)', source:'smile2.png'}]
 * @return Массив, хранящий порядковый номер первого символа смайлика и сам смайлик, например [{position:8, smile:':)',source:'smile.png' }, {position:15, smile:';)',source:'smile2.png' }] 
 *
 */
private function getSmileIndexes(str:String, smiles:Array):Array {
	var resultArr:Array = [];
	for (var i:uint = 0; i < smiles.length; i++) {
		var lastSmileIndex:int = -1;
 
                /* Пока есть смайлики, ищем их, начиная с позиции предыдущего */
		while (str.indexOf(smiles[i].smile, lastSmileIndex) > -1) {
			var smPos:int = str.indexOf(smiles[i].smile, lastSmileIndex);
			resultArr.push({position:smPos, str:smiles[i].smile, source:smiles[i].source});
			lastSmileIndex = smPos + smiles[i].smile.length;
		}
	}
        /* Сортируем, чтобы в массиве смайлы располагались в том же порядке, в котором располагаются и в строке */
	resultArr.sortOn('position', Array.NUMERIC);
	return resultArr;
}
Дальше нужен метод, который по существующим индексам смайлов превратит xml:
Код:
<flow:span>Привет ;) Мальчики :)</flow:span>
в xmllist:
Код:
<flow:span>Привет </flow:span><flow:img height="auto" width="auto" source="smile2.png"/>;)<flow:span> Мальчики </flow:span><flow:img height="auto" width="auto" source="smile.png"/>:)
Код AS3:
/**
 * Преобразует xml в xmllist и заменяет текстовое представление необходимой разметкой.
 * @param	xml Хмл со смайлами, который необходимо отформатировать
 * @param	smileIndexes Список объектов, которые содержат индексы смайлов, ссылки на граф. представление смайла и текстовое представление смайла.
 * @return xmlList на основе вошедшего xml.
 */
private function getXMLListByXML(xml:XML, smileIndexes:Array):XMLList {
	var resultXMLList:XMLList = new XMLList();
	var s:String = xml.toString();
	for (var i:uint = 0; i < smileIndexes.length; i++) {
		var startStrPos:uint = 0;
 
                /*Если заменяем уже не первый смайлик в строке*/
		if (smileIndexes[i - 1]) {
			startStrPos = smileIndexes[i - 1].position + smileIndexes[i - 1].str.length;
		}
 
                /*Создаем разметку для картинки*/
		var imgXML:XML = XML('<img width="auto" height="auto" source="'+smileIndexes[i].source+'"/>');
		imgXML.setNamespace(this.nameSpace);
 
                /*Теперь изеняем изначальный xml-нод*/
		var strXML:XML = new XML(xml.copy());
                /*Вырезаем смайлик*/
		strXML.* = s.substring(startStrPos, smileIndexes[i].position);
	        /*Вставляем в xmllist сначала изначальную строку с вырезанным смайликом, потом вставляем строку для смайла*/
	        resultXMLList[resultXMLList.length()] = strXML;
		resultXMLList[resultXMLList.length()] = imgXML;
	}
 
        /*Если смайликов больше одного, то вырезаем последний смайл из строки и завершаем лист последним элементом <flow:span>*/
	if (smileIndexes.length > 0) {
		strXML = new XML(xml.copy());
		strXML.* = s.substring(smileIndexes[i - 1].position + smileIndexes[i - 1].str.length, s.length);
		resultXMLList[resultXMLList.length()] = strXML;
	}
	return resultXMLList;
}
Ну собственно вот и все. Теперь осталось рекурсивно обойти все ноды.


Код AS3:
/**
 * Ищет смайлы и заменяет текстовое представление нужной разметкой
 * @param	xml Полный xml, содержащий текст и смайлы.
 * @param	smilesArr Список смайлов.
 */
private function searchSmileys(xml:XML, smilesArr:Array):void {
	for each(var x:XML in xml.*) {
	x.setNamespace(this.nameSpace);
		if (x.hasComplexContent()) {
			searchSmileys(x, smilesArr);
		}else {
			var s:String = x.toString();
			var smileIndexes:Array = getSmileIndexes(s, smilesArr);
		        /*Вставляем полученный xmllist до того хмл, который нужно заменить*/
			x.parent().insertChildBefore(x, getXMLListByXML(x, smileIndexes));
			if (smileIndexes.length > 0) { 
                                /*Удаляем уже ненужный нод*/
				delete x.parent().*[x.childIndex()];
			}
		}
	}
}
Вы еще не передумали?

Вообще, наверняка можно сделать все гораздо элегантнее, но другого способа я не нашел.
__________________
#flasher@irc.trg.ru:6667

Старый 20.08.2009, 22:04
DARIUS1 вне форума Посмотреть профиль Отправить личное сообщение для DARIUS1 Найти все сообщения от DARIUS1
  № 5  
Ответить с цитированием
DARIUS1
 
Аватар для DARIUS1

Регистрация: Jul 2009
Сообщений: 50
Obi

а у тя рабочий исходник не найдётся для примера?

Старый 20.08.2009, 22:07
Obi вне форума Посмотреть профиль Отправить личное сообщение для Obi Найти все сообщения от Obi
  № 6  
Ответить с цитированием
Obi
 
Аватар для Obi

Регистрация: Nov 2007
Адрес: Moscow
Сообщений: 566
Цитата:
Сообщение от DARIUS1 Посмотреть сообщение
Obi

а у тя рабочий исходник не найдётся для примера?
За определенную нескромную плату найдется.

Я же все достаточно подробно разъяснил.
__________________
#flasher@irc.trg.ru:6667

Старый 27.01.2010, 12:32
firsoff вне форума Посмотреть профиль Отправить личное сообщение для firsoff Посетить домашнюю страницу firsoff Найти все сообщения от firsoff
  № 7  
Ответить с цитированием
firsoff

Регистрация: Sep 2005
Адрес: Snezhinsk, Russia
Сообщений: 367
Отправить сообщение для firsoff с помощью ICQ Отправить сообщение для firsoff с помощью Skype™
ммм во флекс фреймворке ( FlexSDK4) есть уже готовый конвертер, так что не надо велосипеды придумывать:

Код AS3:
 
var tf:* = TextConverter.importToFlow("text text <img src='dd/dd.jpg'> text2text2", TextConverter.HTML_FORMAT);
trace(TextConverter.export (tf, TextConverter.TEXT_LAYOUT_FORMAT,  "xmlType"));
вроде полностью решает проблему "текст" "смайл" "текст"

С уважением.


Последний раз редактировалось firsoff; 27.01.2010 в 12:36. Причина: косячно разметку сделал
Старый 03.02.2011, 15:23
Jackson вне форума Посмотреть профиль Отправить личное сообщение для Jackson Найти все сообщения от Jackson
  № 8  
Ответить с цитированием
Jackson

Регистрация: Sep 2010
Сообщений: 33
Эта штука решает проблему "текст" "смайл" "текст"?
Можно ли её вставить в Flex3?

Старый 31.03.2012, 18:13
Olmer вне форума Посмотреть профиль Отправить личное сообщение для Olmer Посетить домашнюю страницу Olmer Найти все сообщения от Olmer
  № 9  
Ответить с цитированием
Olmer
 
Аватар для Olmer

Регистрация: Feb 2006
Адрес: Луганск
Сообщений: 103
К сожалению не совсем решает, т.к. есть такой баг https://bugs.adobe.com/jira/browse/SDK-21706
Тем кто не боится кривых решений, его можно обойти так:

Код AS3:
setInterval(richText.invalidateSize, 1000);

Старый 31.03.2012, 18:35
kelod вне форума Посмотреть профиль Отправить личное сообщение для kelod Найти все сообщения от kelod
  № 10  
Ответить с цитированием
kelod

Регистрация: Jan 2012
Сообщений: 97
у меня таже проблемма со смайлами, единственное чат не на xml, а на сокетах, поэтому на выходе получаю строчку.
не пойму зачем действительно изобретать велосипед, почему нельзя просто искать в строке определённый набор символов?
проблема возникает только в корректной вставке самого смайла в текст


Последний раз редактировалось kelod; 31.03.2012 в 18:37.
Создать новую тему Ответ Часовой пояс GMT +4, время: 17:14.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


Часовой пояс GMT +4, время: 17:14.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.