![]() |
|
||||||||||
|
|||||
|
Регистрация: Apr 2007
Адрес: Мишень на карте России
Сообщений: 95
|
Сегодня взялся опробовать новый метод вывода текста в CS4.
Вот что из этого вышло. Думаю вполне неплохо так как ресайз не даёт тормозов даже с большим текстом. Но все-таки кто что может предложит оптимизировать. А так есть пару вопросов. Адобовцы заложили способ выделять такой текст? И ешё если в текстовую линию помещаю графический элемент который больше её то весь текстовый блок пропадает! То есть это так и задумано и надо предварительно те что не влезут ужимать ? 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. Причина: оптимизация кода |
|
|||||
|
Регистрация: 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 |
![]() |
![]() |
Часовой пояс GMT +4, время: 09:34. |
|
|
« Предыдущая тема | Следующая тема » |
|
|