|
|
|||||
Banned
[+4 01.02.09]
[+1 01.02.09] |
Что поделать, аттрубут ALIGN во флеше имеет всего два значения и значит придется вычислять место, поверх которого будет отображаться смайлик.
Большой точности в координатах я добился так: 1) выделял уникальным цветом нужное место в текстовом поле (временно) 2) снимал скриншот текстового поля в битмапдату 3) с помощью getColorBoundsRect определял координаты уникального цвета в битмапдате |
|
|||||
Регистрация: Nov 2008
Сообщений: 45
|
chingachgoog, ну ты оригинал !, мнеб такое в голову точноб не пришло , ладно буду пытатся ченибудь придумать, если ниче не получится прийдется воспользоваться методом из статьи или твоим !, спасибо за идеи !
|
|
|||||
Banned
[+5 15.02.09]
[++5 15.02.09] Регистрация: Mar 2008
Адрес: Krasnoyarsk
Сообщений: 587
|
class Systems.Components.TextFieldSuite { private var tf:TextField; private var smiles:Array = []; private var str:Number = 0; private var smilingArea:MovieClip; private static var smile_str:Array = ['XD', ':)', ':(', ':*', '8)', ':/', ';)', ':O', ':D', '%)', ':[', ':P']; private static var SPLIT_LINES_SYMBOL:String = String.fromCharCode('13'); private static var WORD_SPLITTER:String = ' '; private static var SYMBOL_WIDTH:Number = 8; private static var LINE_HEIGHT:Number = 18; private static var SMILE_GABARITES:Number = 16.6; private static var SMILE_Y_PADDING:Number = 0.9; private static var SMILE_X_PADDING:Number = 5.8; private var whitesLine:String = ''; public var active:Boolean = false; public function TextFieldSuite(textField:TextField) { tf = textField; whitesLine = generateWhitesLine(); calculateStringSize(); configuration(); } public function get strSize():Number { return str; } public function _enabled(stat:Boolean):Void { smilingArea._visible = stat; active = stat; changeText(); } private function configuration():Void { tf.onScroller = Delegate.create(this, onScroll); } private function onScroll():Void { changeText(); } public function resizeWidth():Void { calculateStringSize(); changeText(); } private function calculateStringSize():Void { var textField:TextField = _root.lineSplendor; textField._width = tf._width; var tfW:Number = textField.textWidth / 8; str = tfW; } public function resizeHeight():Void { changeText(); } public function htmlChanged():Void { var buf:String = tf.htmlText; tf.htmlText = ''; tf.htmlText = buf; changeText(); } private function strRend(arg:String):Array { var lines:Array = [] var line:String = ''; var whitesCount:Number = 0; var s:Array = arg.split(' '); // //trace(s); // //trace("ARG: " + arg); var sLen:Number = s.length; for (var i = 0; i < sLen; i++) { var word:String = s[i]; //var wLen:Number = word.length; if (word.length > str) { lines.push(line + addWhites(whitesCount)); line = ''; var words:Array = strSplit(word, str); var wordsLength:Number = words.length; for (var j:Number = 0; j < wordsLength; j++) { var wrd:String = words[j]; if (wrd.length == str) lines.push(wrd); else line = wrd; } } else { if (word != '') { var bLine:String = line + addWhites(whitesCount) + word; var compareLength:Number = bLine.length; if (compareLength > str) { lines.push(line) whitesCount = 0; line = word; } else { line = bLine; whitesCount = 0; } } whitesCount++; } } if (line.length != 0) lines.push(line); //trace("LINES: "+lines); return lines; } private function addWhites(count:Number):String { return whitesLine.substr(0, count); } private function cuteText(txt:String, startLine:Number, endLine:Number):Array{ var lines:Array = []; var spl:Array = txt.split(SPLIT_LINES_SYMBOL); var splLen:Number = spl.length; for (var i:Number = 0; i < splLen; i++) { var string:String = spl[i]; var wrapedString:Array = strRend(string); if (wrapedString[0].length == 0 && wrapedString.length > 1) wrapedString.shift(); //trace(wrapedString); lines = lines.concat(wrapedString); } return lines.splice(startLine, endLine - startLine); } //qqqqqqqq rrrrrrrrrrrrrrr;E ttttttttttttttt:Q private function addAddobTextFieldMagicFeatures(str:String):String { for (var i:Number = 0, condition:Boolean = true; condition; condition = str.charAt(i) == WORD_SPLITTER, i++) { } //trace("STRINGI: "+str + ', \n' + str.substr(i -1 )); return str.substr(i - 1); } private function strSplit(text:String, range:Number):Array { var ret:Array = []; var sLen:Number = text.length; for(;text.length != 0;) { var line:String = text.substr(0, range); text = text.substr(range); ret.push(line); } return ret; } private function changeText():Void { if (!active) return; var tStr:String = tStr = tf.text; var sLength:Number = smiles.length; smilingArea.removeMovieClip(); smilingArea = _root.createEmptyMovieClip('smilingArea_', 50); var lines:Array = cuteText(tStr, tf.scroll - 1, tf.bottomScroll); var lLen:Number = lines.length; //trace(lines); for (var i:Number = 0, c:Number = 0; i < lLen; i++) { var strings:Array = splitStr(lines[i]); var strLen:Number = strings.length; for (var j:Number = 0; j < strLen; j++, c++) { var s:String = strings[j].str; var smile:String = strings[j].smile; var x:Number = s.length * SYMBOL_WIDTH + tf._x + SMILE_X_PADDING; var y:Number = i * LINE_HEIGHT + tf._y + SMILE_Y_PADDING; var smile:MovieClip = smilingArea.attachMovie('smile_'+smile+'', 'smile'+c, 50+c, {_width:SMILE_GABARITES, _height:SMILE_GABARITES, _x:x, _y:y}); //trace("STR: "+s); ///trace("STRING LENGTH: "+sLength); ///trace("LINE: "+i); //trace("LIN:O: "+lines[i]); //smiles.push(smile); } } } private function splitStr(str:String):Array { var sLen:Number = smile_str.length; var ret:Array = []; for(var i:Number = 0; i<sLen; i++) { var smile:String = smile_str[i]; for ( var index:Number = str.indexOf(smile); index != -1; index = str.indexOf(smile, index + smile.length)) { var s:String = str.substr(0, index); ret.push({str:s, smile:smile}); } } return ret; } private function generateWhitesLine():String { var ret:String = '' for (var i:Number = 0; i < 50; i++) { ret += ' '; } return ret; } } smile_str - Это айди смайлов в библиотеке. SYMBOL_WIDTH - Ширина 1 символа(Не спрашивайте как я это получил... Методоп тыка щитал P.S Использовался FixedSys size 15, P.P.S Шрифт должен быть обязательно моноширийный). LINE_HEIGHT - Высота 1 строки(опять тоже самое...) SMILE_GABARITES - Габариты смайла SMILE_Y_PADDING - Дельта смайла по Y опять же помойму методом тыка щитал... %). SMILE_X_PADDING - Дельта смайла по X htmlChanged - Должно вызыватся при изменении текста в текстовом поле. resizeHeight, resizeWidth - Вызываются при изменении высоты и соответственно ширины текстового поля. Пример использования: Смайлы будут находится над текстом но текст под ними будет выделятся. 1 Смайл тут занимает место 2х символов текста Последний раз редактировалось qazwsx; 25.02.2009 в 20:17. |
|
|||||
Banned
[+4 01.02.09]
[+1 01.02.09] |
К сожалению ничего другого, для нужной точности (до пиксела) для любого типа шрифта и любого типа сглаживания и т.п. мне найти не удалось. Но зато реализация открыла массу возможностей (например, теперь легко можно поменять цвет бэкграунда за любым символом).
|
|
|||||
Banned
[+5 15.02.09]
[++5 15.02.09] Регистрация: Mar 2008
Адрес: Krasnoyarsk
Сообщений: 587
|
Вот смотри все точно
|
|
|||||
Регистрация: Nov 2008
Сообщений: 45
|
есть textField с параметром multiline, в нем текст в несколько строк делиться - как вообще из этих строк массив сделать ?, чето у меня не получается, пробовал так:
|
|
|||||
Banned
[+5 15.02.09]
[++5 15.02.09] Регистрация: Mar 2008
Адрес: Krasnoyarsk
Сообщений: 587
|
Ну вот же я код выложил... Смотри там щитаеш символы, пробелы(волшебные пробелы адоба), переводы строк... >_<.
|
|
|||||
Регистрация: Nov 2008
Сообщений: 45
|
а можно поподробней?, я так понимаю волшебство адоба тут описывается в строке
у себя в текстфилде проверил, чтото он там не находит таких символов, да и при вставке онного тоже как перенос не воспринимает, '\n' воспринимает, но тоже не находит .... или я чтото упустил ? |
|
|||||
Banned
[+5 15.02.09]
[++5 15.02.09] Регистрация: Mar 2008
Адрес: Krasnoyarsk
Сообщений: 587
|
Нет тут просто перенос строки тоже самое что и \n. Если ты не делал переводов строки в текстфилде естественно он их ненайдет. То что строка в текстовом поле перешла на следуюшую это не значит что там есть перевод строки...
|
|
|||||
Регистрация: Nov 2008
Сообщений: 45
|
спасибо за советы, сделал через getColorBoundsRect как посоветовал chingachgoog, плюс понадобилось getTextExtent, скриншотю при поступлении строки столько раз сколько объектов в строке, загоняю графику каждой строки в отдельный мувик, и при скроле оперирую уже с этими клипами, помойму нагрузка таким методом меньше, чем перебирать все слова, опятьже и точность помойму выше ....
возник вопрос в ходе работы как лучше реализовать хранение инфы о графике, которая по мере поступления новых строк выходит за пределы техстФилда, я пока сделал что у меня просто _visible = false, когда клип в таком состоянии он много памяти жрет?, или лучше загнать все его параметры в массив, и при надобности из массива создавать заново ? |
Часовой пояс GMT +4, время: 12:10. |
|
« Предыдущая тема | Следующая тема » |
|
|