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

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

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 25.02.2009, 13:34
chingachgoog вне форума Посмотреть профиль Найти все сообщения от chingachgoog
  № 11  
Ответить с цитированием
chingachgoog
Banned
[+4 01.02.09]
[+1 01.02.09]
 
Аватар для chingachgoog

блогер
Регистрация: Nov 2006
Адрес: Moscow
Сообщений: 2,145
Записей в блоге: 7
Что поделать, аттрубут ALIGN во флеше имеет всего два значения и значит придется вычислять место, поверх которого будет отображаться смайлик.
Большой точности в координатах я добился так:
1) выделял уникальным цветом нужное место в текстовом поле (временно)
2) снимал скриншот текстового поля в битмапдату
3) с помощью getColorBoundsRect определял координаты уникального цвета в битмапдате

Старый 25.02.2009, 20:05
1uka вне форума Посмотреть профиль Отправить личное сообщение для 1uka Найти все сообщения от 1uka
  № 12  
Ответить с цитированием
1uka

Регистрация: Nov 2008
Сообщений: 45
chingachgoog, ну ты оригинал !, мнеб такое в голову точноб не пришло , ладно буду пытатся ченибудь придумать, если ниче не получится прийдется воспользоваться методом из статьи или твоим !, спасибо за идеи !

Старый 25.02.2009, 20:06
qazwsx вне форума Посмотреть профиль Найти все сообщения от qazwsx
  № 13  
Ответить с цитированием
qazwsx
Banned
[+5 15.02.09]
[++5 15.02.09]

Регистрация: Mar 2008
Адрес: Krasnoyarsk
Сообщений: 587
Код AS1/AS2:
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 - Вызываются при изменении высоты и соответственно ширины текстового поля.

Пример использования:
Код AS1/AS2:
	import Systems.Components.TextFieldSuite;
 
	var tf:TextField = createTextField('test', 1);
	var suite:TextFieldSuite = new TextFieldSuite(tf);
Смайлы будут находится над текстом но текст под ними будет выделятся. 1 Смайл тут занимает место 2х символов текста


Последний раз редактировалось qazwsx; 25.02.2009 в 20:17.
Старый 25.02.2009, 20:42
chingachgoog вне форума Посмотреть профиль Найти все сообщения от chingachgoog
  № 14  
Ответить с цитированием
chingachgoog
Banned
[+4 01.02.09]
[+1 01.02.09]
 
Аватар для chingachgoog

блогер
Регистрация: Nov 2006
Адрес: Moscow
Сообщений: 2,145
Записей в блоге: 7
Цитата:
Сообщение от 1uka Посмотреть сообщение
chingachgoog, ну ты оригинал
К сожалению ничего другого, для нужной точности (до пиксела) для любого типа шрифта и любого типа сглаживания и т.п. мне найти не удалось. Но зато реализация открыла массу возможностей (например, теперь легко можно поменять цвет бэкграунда за любым символом).

Старый 25.02.2009, 21:56
qazwsx вне форума Посмотреть профиль Найти все сообщения от qazwsx
  № 15  
Ответить с цитированием
qazwsx
Banned
[+5 15.02.09]
[++5 15.02.09]

Регистрация: Mar 2008
Адрес: Krasnoyarsk
Сообщений: 587
Вот смотри все точно

Старый 26.02.2009, 13:04
1uka вне форума Посмотреть профиль Отправить личное сообщение для 1uka Найти все сообщения от 1uka
  № 16  
Ответить с цитированием
1uka

Регистрация: Nov 2008
Сообщений: 45
есть textField с параметром multiline, в нем текст в несколько строк делиться - как вообще из этих строк массив сделать ?, чето у меня не получается, пробовал так:

Код:
var Arr:Array = textField.text.split("\n");

Старый 26.02.2009, 13:10
qazwsx вне форума Посмотреть профиль Найти все сообщения от qazwsx
  № 17  
Ответить с цитированием
qazwsx
Banned
[+5 15.02.09]
[++5 15.02.09]

Регистрация: Mar 2008
Адрес: Krasnoyarsk
Сообщений: 587
Ну вот же я код выложил... Смотри там щитаеш символы, пробелы(волшебные пробелы адоба), переводы строк... >_<.

Старый 26.02.2009, 18:23
1uka вне форума Посмотреть профиль Отправить личное сообщение для 1uka Найти все сообщения от 1uka
  № 18  
Ответить с цитированием
1uka

Регистрация: Nov 2008
Сообщений: 45
а можно поподробней?, я так понимаю волшебство адоба тут описывается в строке
Код:
var SPLIT_LINES_SYMBOL:String = String.fromCharCode('13');
у себя в текстфилде проверил, чтото он там не находит таких символов, да и при вставке онного тоже как перенос не воспринимает, '\n' воспринимает, но тоже не находит .... или я чтото упустил ?

Старый 26.02.2009, 18:44
qazwsx вне форума Посмотреть профиль Найти все сообщения от qazwsx
  № 19  
Ответить с цитированием
qazwsx
Banned
[+5 15.02.09]
[++5 15.02.09]

Регистрация: Mar 2008
Адрес: Krasnoyarsk
Сообщений: 587
Нет тут просто перенос строки тоже самое что и \n. Если ты не делал переводов строки в текстфилде естественно он их ненайдет. То что строка в текстовом поле перешла на следуюшую это не значит что там есть перевод строки...

Старый 01.03.2009, 19:25
1uka вне форума Посмотреть профиль Отправить личное сообщение для 1uka Найти все сообщения от 1uka
  № 20  
Ответить с цитированием
1uka

Регистрация: Nov 2008
Сообщений: 45
спасибо за советы, сделал через getColorBoundsRect как посоветовал chingachgoog, плюс понадобилось getTextExtent, скриншотю при поступлении строки столько раз сколько объектов в строке, загоняю графику каждой строки в отдельный мувик, и при скроле оперирую уже с этими клипами, помойму нагрузка таким методом меньше, чем перебирать все слова, опятьже и точность помойму выше ....
возник вопрос в ходе работы как лучше реализовать хранение инфы о графике, которая по мере поступления новых строк выходит за пределы техстФилда, я пока сделал что у меня просто _visible = false, когда клип в таком состоянии он много памяти жрет?, или лучше загнать все его параметры в массив, и при надобности из массива создавать заново ?

Создать новую тему Ответ Часовой пояс GMT +4, время: 13:10.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

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

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


 


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


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