Resizing Flash Documents to Fit Contents in JSFL
Posted by: Keith H in ActionScript 3, Flash 9, Flex, JSFL, tags: automation, JSFL, ResizeI use Flex for the majority of my Flash related work, even for writing plain ActionScript. Lately I've barely even used the Flash authoring environment to create stuff. When I do use the Flash authoring environment, it's mostly for automation and prep work of content. If you are like me, you write JSFL to do that stuff.
I love automating redundant tasks. One thing that bugs me when importing graphical assets to Flash's stage is having to resize the document to what I imported. I like that I can do this by going to the Document Properties and setting the document to match the content size, but if I have to do this each time I import/export content it becomes a irksome chore. I write JSFL scripts that run tasks on multiple files, having a "match contents" function would be useful to me in my case...maybe to you as well. I do not see a JSFL way to do this. (Maybe there is and I had a brain fart?). Until then, here is a script I wrote to do it in JSFL...
/*****************************************************************************************
What: Document_to_Content_Size.jsfl
JSFL Command for Flash (8+) that will resize the document to fit the content
that is on the stage in the authoring environment.
Why: Yep, this action can also be done by going to the Document Properties
and setting "match" to "contents". However, I have not
found a way to do this same action within JSFL script
If you know a JSFL way to do this same action easier contact me.
Date: March 21, 2010
Author: Keith Hair
Contact khos2007@gmail.com
Web: keith-hair.net
INSTALL:
If you deal with JSFL you probably know what to do, but anyway...
Save this script with a ".jsfl" extension and put in:
"Your Flash installation folder\en\First Run\Commands" folder
Or just put it anywhere and double-click the file.
LEGAL STUFF:
This script is free for whatever, just improve it or say hello!
NOTE:
This is primarily for resizing the Flash
document to fit content that is imported to the stage.
Resizing is buggy with Component instances.
******************************************************************************************/
fl.outputPanel.clear();
runApp();
function runApp()
{
var doc=fl.getDocumentDOM();
var element;
var docw=1;
var doch=1;
var fn=0;
var ln=0;
var en=0;
var tframes;
var layer;
var frame;
var ox;
var oy;
var left=null;
var right=null;
var top=null;
var bottom=null;
var cf=doc.getTimeline().currentFrame;
while(ln < doc.getTimeline().layerCount)
{
layer=doc.getTimeline().layers[ln];
tframes=layer.frameCount;
fn=0;
while(fn < tframes)
{
doc.getTimeline().currentFrame = fn;
frame=layer.frames[fn];
en=0;
while(en < frame.elements.length)
{
element = frame.elements[en];
ox=element.x;
oy=element.y;
if(left == null){
left=ox;
}
if(right == null){
right=ox+element.width;
}
if(top == null){
top=oy;
}
if(bottom == null){
bottom=oy+element.height;
}
left=Math.min(ox,left);
right=Math.max(ox+element.width,right);
top=Math.min(oy,top);
bottom=Math.max(oy+element.height,bottom);
en++;
}
fn++;
}
ln++;
}
fl.trace("CURRENT SIZE-->\t"+doc.width+" x "+doc.height);
docw=Math.round(right-left);
doch=Math.round(bottom-top);
moveAllElementsBy(-left,-top);
doc.width=docw;
doc.height=doch;
fl.trace("NEW SIZE-->\t\t\t"+doc.width+" x "+doc.height);
doc.getTimeline().currentFrame=cf;
}
function moveAllElementsBy(tx,ty)
{
doc=fl.getDocumentDOM();
var element;
var fn=0;
var ln=0;
var en=0;
var tframes;
var layer;
var frame;
var otp;
while(ln < doc.getTimeline().layerCount)
{
layer=doc.getTimeline().layers[ln];
tframes=layer.frameCount;
fn=0;
while(fn < tframes)
{
doc.getTimeline().currentFrame = fn;
frame=layer.frames[fn];
en=0;
while(en < frame.elements.length)
{
element=frame.elements[en];
element.x+=tx;
element.y+=ty;
if(element.elementType.search(/instance|text/mig) == -1){
element.x+=element.width/2;
element.y+=element.height/2;
}
en++;
}
fn++;
}
ln++;
}
}
Entries (RSS)
Thanks a lot! This is exactly what I was looking for!
Yeah, just what I needed too! Thanks!!
You might want to check out my new framework, xJSFL.
The same can be achieved in 4 lines of code!
$(‘*’).move(0, 0);
var bounds = new Bounds($selection);
$dom.width = bounds.width;
$dom.height = bounds.height;
Cheers,
Dave