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

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

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

Регистрация: Apr 2007
Адрес: Мишень на карте России
Сообщений: 95
По умолчанию flash.text.engine

Сегодня взялся опробовать новый метод вывода текста в CS4.
Вот что из этого вышло. Думаю вполне неплохо так как ресайз не даёт тормозов даже с большим текстом. Но все-таки кто что может предложит оптимизировать.
А так есть пару вопросов.
Адобовцы заложили способ выделять такой текст?
И ешё если в текстовую линию помещаю графический элемент который больше её то весь текстовый блок пропадает! То есть это так и задумано и надо предварительно те что не влезут ужимать ?

Код AS3:
package {
	import flash.display.*;
	import flash.events.*;
	import flash.utils.Timer;
	import flash.text.engine.*;
	import LoaderExample;
 
	public class GroupElementExample extends Sprite {
		var format:ElementFormat;
		var TF:MovieClip=new MovieClip  ;
		var smileName=[":-)","8-)",":-D"];
		var smileNameLink=["0.swf","1.swf","2.swf"];
		var mc_array:Array=new Array  ;
		var loadTimer:Timer=new Timer(500,1);
		var textBlock:TextBlock=new TextBlock  ;
 
		public function GroupElementExample():void {
			stage.scaleMode=StageScaleMode.NO_SCALE;
			stage.align=StageAlign.TOP_LEFT;
			stage.addEventListener(Event.RESIZE,resizeHandler);
			loadTimer=new Timer(100,1);
			loadTimer.addEventListener(TimerEvent.TIMER, resizeHandler);
 
			format=new ElementFormat  ;
			var fontDescription:FontDescription=new FontDescription("Arial");
			format.fontSize=16;
			format.fontDescription=fontDescription;
			getSubstring('"Мы любим тех, кто нас не любит.:-)'+
			'Не любим тех, кто любит нас.:-D'+
			'Легко доставшиеся губы,:-)'+
			'не радуют, а обжигают нас.:-)'+
			'Любя далёкое, томимся,:-)'+
			'в тоске проводим дни свои.8-)'+
			'Мы любим то, к чему стремимся,8-)'+
			'а как достигнем, нет любви.":-D',smileName);
			TF=new MovieClip  ;
			addChild(TF);
		}
 
		private function resizeHandler(event:Event):void {
			var now:Date = new Date();
			trace(now.getMilliseconds());
			var textElement:TextElement;
			var graphicElement:GraphicElement;
			var groupVector:Vector.<ContentElement>=new Vector.<ContentElement>  ;
			if (mc_array.length>0) {
				for (var i:Number=0; i<mc_array.length; i++) {
					textElement=new TextElement(mc_array[i].xt,format);
					graphicElement=new GraphicElement(mc_array[i].img,mc_array[i].img.width,mc_array[i].img.height,format);
					groupVector.push(graphicElement,textElement);
				}
			}
			var groupElement=new GroupElement(groupVector);
			textBlock.content=groupElement;
			createTextLines(textBlock);
			var now:Date = new Date();
			trace('end  '+now.getMilliseconds());
		}
 
		private function createTextLines(textBlock:TextBlock):void {
			while (TF.numChildren) {
				TF.removeChildAt(0);
			}
			var yPos=0;
			var line_length:Number=stage.stageWidth-10;
			var textLine:TextLine=textBlock.createTextLine(null,line_length);
			while (textLine) {
				TF.addChild(textLine);
				textLine.x=10;
				yPos+=textLine.height+2;
				textLine.y=yPos;
				textLine=textBlock.createTextLine(textLine,line_length);
			}
		}
 
		function reDrawSmile(event:Event):void {
			trace(event.target.name);
			loadTimer.start();
			if (event.target.height>30) {
				event.target.scaleX=0.4;
				event.target.scaleY=0.4;
			}
		}
 
		function getSubstring(txt:String,smile:Array):void {
			var ia:Array;
			var index:String;
			for (var i=0; i<smile.length; i++) {
				if (i<10) {
					index='0'+i;
				}
				txt=txt.split(smile[i]).join('[!img!]'+index+' ');
			}
			ia=txt.split('[!img!]');
			for (var j=0; j<ia.length; j++) {
				if (ia[j].length>0) {
					j==0?index='':index=ia[j].substr(0,2);
					var box=new LoaderExample  ;
					if (index!='') {
						super.addEventListener('load.Complate',this.reDrawSmile);
						box.load(smileNameLink[Number(index)]);
					}
					mc_array.push({img:box,xt:ia[j].substr(index.length)});
				}
			}
			loadTimer.start();
		}
	}
}
Изображения
 
__________________
Lepricon Flash ICQ


Последний раз редактировалось iNils; 03.08.2012 в 23:21. Причина: оптимизация кода
Старый 31.10.2008, 03:15
WGR вне форума Посмотреть профиль Отправить личное сообщение для WGR Посетить домашнюю страницу WGR Найти все сообщения от WGR
  № 2  
Ответить с цитированием
WGR
 
Аватар для WGR

Регистрация: Apr 2007
Адрес: Мишень на карте России
Сообщений: 95
да.. Видимо рановато про CS4 ещё спрашивать что либо
Пробывал выделять текст в text.engine. Больше времени потратил на подсветку выделения!
Код:
package {
	import flash.display.Sprite;
	import flash.text.engine.*;
	import flash.events.MouseEvent;
	import flash.events.EventDispatcher;
	import flash.ui.Mouse;
	import flash.geom.Rectangle;
	import flash.geom.Point;
	import LoaderExample;
	import flash.text.TextField;
	import flash.text.TextFieldAutoSize;

	public class TextLineMirrorRegionExample extends Sprite {
		var myEvent:EventDispatcher=new EventDispatcher  ;
		var fontDescription:FontDescription=new FontDescription  ;
		var textBlock:TextBlock=new TextBlock  ;
		var aD:Number;
		var aM:Number;
		var aU:Number;
		var aDline:Number;
		var aMline:Number;
		var aUline:Number;
		var beginLine:TextLine;
		var endLine:TextLine;
		var lineWidth:Number=250;
		var xPos:Number=55;
		var yPos:Number=80;
		var select:Sprite;
		var label:TextField;
		var textLabel:String="Выделенный текст=";

		public function TextLineMirrorRegionExample():void {

			fontDescription.fontWeight="bold";
			var blackFormat:ElementFormat=new ElementFormat  ;
			blackFormat.fontSize=18;
			blackFormat.color=0x000000;
			blackFormat.fontDescription=fontDescription;

			var textElement1=new TextElement("aD- atom in TextBlok (mouseDown)!!!!!!!!!!!!",blackFormat);
			var textElement2=new TextElement("aM- atom in TextBlok (mouseMove)!!!!!!!!!!!!",blackFormat);
			var textElement3=new TextElement("aU- atom in TextBlok (mouseUp)!!!!!!!!!!!!!!",blackFormat);
			var textElement4=new TextElement("aDline, aMline, aUline- позиция атомов относительно их линии (D-нажатие, M-наведение, U-отпускание)",blackFormat);
			var textElement5=new TextElement("select- спрайт с выделением линии. PS немного касячет подсветка при выделение снизу",blackFormat);

			label=createLabel();
			label.y=10;
			label.x=330;
			label.autoSize=TextFieldAutoSize.LEFT;
			label.wordWrap=true;
			addChild(label);

			var box=new LoaderExample  ;
			box.load('1.swf');
			var graphicElement:GraphicElement=new GraphicElement(box,20,20,blackFormat);

			myEvent.addEventListener("mouseOut",mouseOutHandler);
			myEvent.addEventListener("mouseOver",mouseOverHandler);
			myEvent.addEventListener("mouseUp",mouseUpHandler);
			myEvent.addEventListener("mouseDown",mouseDownHandler);
			myEvent.addEventListener("mouseMove",mouseMoveHandler);

			var groupVector:Vector.<ContentElement>=new Vector.<ContentElement>  ;
			groupVector.push(textElement1,textElement2,textElement3,graphicElement,textElement4,textElement5);
			var groupElement:GroupElement=new GroupElement(groupVector);
			groupElement.eventMirror=myEvent;

			textBlock.content=groupElement;
			createLines(textBlock);
		}

		private function createLabel():TextField {
			var txtField:TextField=new TextField  ;
			txtField.text=textLabel;
			return txtField;
		}

		private function mouseOverHandler(event:MouseEvent):void {
			Mouse.cursor="ibeam";
		}

		private function mouseOutHandler(event:MouseEvent):void {

			Mouse.cursor="arrow";
		}

		private function mouseUpHandler(event:MouseEvent):void {
			var line:TextLine=event.target as TextLine;
			var AL:Number=line.getAtomIndexAtPoint(event.stageX,event.stageY);
			var AB:Number=line.getAtomTextBlockBeginIndex(0)+AL;
			aUline=AL;
			aMline=AL;
			aU=AB;
			if (aD<aU) {//достаём выделенный текст, а всё остальное лишь подсветка выделения
				label.text=textLabel+line.textBlock.content.rawText.substr(aD,aU-aD);
			} else {
				label.text=textLabel+line.textBlock.content.rawText.substr(aU,aD-aU);
			}

			showAtoms(line,AL);
			endLine=line;
			if (aD==aU) {
				removeAtoms();
			} else {
				showAtoms2(beginLine,line);
			}
		}

		private function mouseDownHandler(event:MouseEvent):void {
			removeAtoms();
			var line:TextLine=event.target as TextLine;
			var AL:Number=line.getAtomIndexAtPoint(event.stageX,event.stageY);
			var AB:Number=line.getAtomTextBlockBeginIndex(0)+AL;
			aDline=AL;
			aD=AB;
			showAtoms(line,AL);
			beginLine=line;
		}
		private function mouseMoveHandler(event:MouseEvent):void {
			if (event.buttonDown) {
				var line:TextLine=event.target as TextLine;
				var AL:Number=line.getAtomIndexAtPoint(event.stageX,event.stageY);
				var AB:Number=line.getAtomTextBlockBeginIndex(0)+AL;
				aMline=AL;
				aM=AB;
				endLine=line;
				showAtoms(line,AL);
				showAtoms2(beginLine,line);
			}

		}
		private function showAtoms(textLine,begin):void {
			var bounds:Rectangle=textLine.getAtomBounds(begin);
			drawLineShadow(textLine,bounds.left,bounds.top,bounds.width,bounds.height);
		}

		private function showAtoms2(begin,end):void {
			removeAtoms();
			var beginR:Rectangle=begin.getAtomBounds(aDline);
			var endR:Rectangle=end.getAtomBounds(aMline);
			if (aD>aU) {//если атом на который нажали дальше, то меняем местами 
				var tTemp:TextLine=begin;
				begin=end;
				end=tTemp;
				trace(aDline);
				beginR=end.getAtomBounds(aMline);
				endR=begin.getAtomBounds(aDline);
			}

			var tLine:TextLine=begin;
			var tR:Rectangle=tLine.getAtomBounds(0);

			if (end!=begin) {//первая линия
				drawLineShadow(tLine,beginR.left,tR.top,tLine.textWidth-beginR.left,tLine.textHeight);
				tLine=tLine.nextLine;
			} else {
				drawLineShadow(tLine,beginR.left,tR.top,endR.left-beginR.left,tLine.textHeight);
			}

			while (tLine!=end) {//промежуточные линии
				tR=tLine.getAtomBounds(0);
				drawLineShadow(tLine,tR.left,tR.top,tLine.textWidth,tLine.textHeight);
				tLine=tLine.nextLine;
			}
			if (end!=begin) {//если выделили больше одной линии
				if (tLine==end) {//последняя линия
					tR=tLine.getAtomBounds(0);
					drawLineShadow(tLine,tR.left,tR.top,endR.left,tLine.textHeight);
				}
			}
		}

		private function drawLineShadow(tLine,l,t,w,h):void {
			var box:Sprite=new Sprite  ;
			var mcGraphics=box.graphics;
			mcGraphics.beginFill(0x00FF00,0.3);
			mcGraphics.drawRect(l,t,w,h);
			mcGraphics.endFill();
			//добавляем зелёного ребёнка чтобы узнать положение линии
			// может кто другой вариант предложит?
			tLine.addChild(box);
			var cPoint:Point=box.localToGlobal(new Point(box.x,box.y));
			box.x=cPoint.x-xPos;
			box.y=cPoint.y-yPos;
			tLine.removeChildAt(tLine.numChildren-1);
			select.addChild(box);
		}

		private function removeAtoms():void {
			while (select.numChildren) {
				select.removeChildAt(0);
			}
		}

		private function createLines(textBlock:TextBlock):void {
			select=new Sprite  ;
			select.x=xPos;
			select.y=yPos;
			addChild(select);
			var purgeLine:TextLine=textBlock.firstLine;

			while (purgeLine) {
				removeChild(purgeLine);
				purgeLine=purgeLine.nextLine;
			}
			var yP:Number=yPos;

			var textLine:TextLine=textBlock.createTextLine(null,lineWidth);

			while (textLine) {
				textLine.x=xPos;
				textLine.y=yP;
				yP+=textLine.height+2;
				addChild(textLine);
				textLine=textBlock.createTextLine(textLine,lineWidth);
			}

		}
	}
}
Думаю, я тут перемудрил с позициями линий
Завтра попробую другим методом подсветить выделение.
Изображения
 
__________________
Lepricon Flash ICQ

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

блогер
Регистрация: Jul 2007
Адрес: Russia
Сообщений: 292
Записей в блоге: 5
Код:
myEvent.addEventListener("mouseOut",mouseOutHandler);
Не надо так писать event.type
__________________
Оптимизация производительности на уровне кода

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

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

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


 


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


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