|
|
|||||
Регистрация: Jul 2009
Сообщений: 50
|
Как сделать смайлы на AS3?
Помогите пожалуйста)
Как сделать смайлы на AS3? Делаю чат! Незнаю как сделать смайлы! Эта методика мне не помогла! http://www.delphimaster.ru/articles/flash/index.html Надо придумать как сделать чтобы в динамическом поле текста т.е. в самом чате это "=)" заменялось этим то есть текст определённой картинкой! И конечно же я не знаю как сделать так чтобы смайл был ровно в строчке и его можно было вставлять между текста! |
|
|||||
Modus ponens
|
Идти сюда и качать примеры:
http://labs.adobe.com/technologies/textlayout/
__________________
Hell is the possibility of sanity |
|
|||||
Регистрация: Jul 2009
Сообщений: 50
|
Цитата:
Последний раз редактировалось DARIUS1; 20.08.2009 в 04:53. |
|
|||||
Регистрация: 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> и дальше начинаются проблемы. А проблемы начинаются, благодаря тому, что в tlf существует строгая иерархия элементов, например вот так быть не может: <flow:span>Привет, мальчики <flow:img height="auto" width="auto" source="smile.png"/></flow:span> Значит просто преобразовать хмл в строку и пройтись циклом, заменяя все на не выйдет. Я решал эту проблему следующим образом: На входе у нас имеется 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"/>:) /** * Ищет в строке смайлы, и возвращает массив с их порядковыми номерами. * * @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; } в 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"/>:) /** * Преобразует 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; } /** * Ищет смайлы и заменяет текстовое представление нужной разметкой * @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 |
|
|||||
Регистрация: Jul 2009
Сообщений: 50
|
Obi
а у тя рабочий исходник не найдётся для примера? |
|
|||||
Регистрация: Nov 2007
Адрес: Moscow
Сообщений: 566
|
За определенную нескромную плату найдется.
Я же все достаточно подробно разъяснил.
__________________
#flasher@irc.trg.ru:6667 |
|
|||||
ммм во флекс фреймворке ( FlexSDK4) есть уже готовый конвертер, так что не надо велосипеды придумывать:
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. Причина: косячно разметку сделал |
|
|||||
Регистрация: Sep 2010
Сообщений: 33
|
Эта штука решает проблему "текст" "смайл" "текст"?
Можно ли её вставить в Flex3? |
|
|||||
Регистрация: Feb 2006
Адрес: Луганск
Сообщений: 103
|
К сожалению не совсем решает, т.к. есть такой баг https://bugs.adobe.com/jira/browse/SDK-21706
Тем кто не боится кривых решений, его можно обойти так: |
|
|||||
Регистрация: Jan 2012
Сообщений: 97
|
у меня таже проблемма со смайлами, единственное чат не на xml, а на сокетах, поэтому на выходе получаю строчку.
не пойму зачем действительно изобретать велосипед, почему нельзя просто искать в строке определённый набор символов? проблема возникает только в корректной вставке самого смайла в текст Последний раз редактировалось kelod; 31.03.2012 в 18:37. |
Часовой пояс GMT +4, время: 17:14. |
|
« Предыдущая тема | Следующая тема » |
|
|