智慧 + 毅力 = 无所不能

正确性、健壮性、可靠性、效率、易用性、可读性、可复用性、兼容性、可移植性...
随笔 - 991, 文章 - 0, 评论 - 27, 阅读 - 341万

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

JSFL 实例

Posted on   Bill Yuan  阅读(2366)  评论(0编辑  收藏  举报

通过fl对象获取当前fla实例。
通过fla实例下的几个对象获取 timeline,layer等IDE结构
fl.getDocumentDOM()


这样可以获得当前的fla实例,对于同时打开的多个FLA,可以用数组的方式制定获取特定的fla实例,比如
fl.getDocumentDOM()[x]

进一步,得到了document对象,就可以通过在IDE中大展宏图了。

几个重要的方法:

document.addNewLine()
document.addNewRectangle()
document.addNewOval()
document.addNewText()
document.breakApart()
………
然后是timeline,layer,frame对象

 

复制代码
代码
//建议大家采用如下“开局”模式:
myDoc = fl.getDocumentDOM();
myTimeline 
= myDoc.getTimeline()
//然后去拓展 layers, frame 对象

//结构如下:
var frameSpan = fl.getDocumentDOM().getTimeline().layers[0].frames[0].duration
//简记为:
var frameSpan = myTimeline.layers[0].frames[0]
//或者对layer再进行取值,使之更简。
复制代码

 



具体操作的时候,遇到一些问题,现整理如下:

人为选择的多层,jsfl只能判对你鼠标拖拽结束的那个层,比如,你从第一层选中不放往下拖拽,到第30层停止,和 你从第30层开始,选到第一层,是不一样的。jsfl分别认为你选中的是第30层和第一层。
frames的选择则不同,frames部分前后,可以任意选择,都返回一个起始frame和一个结束frame。


1.发布文件夹里的所有flash,批量发布文件夹的内容,设置后就做其他事情吧,不用一个一个手动发布了

 

复制代码
代码
var folderURI = fl.browseForFolderURL("选择文件夹");
if (FLfile.exists(folderURI)) {
    var fileMask 
= "*.fla";
    var list 
= FLfile.listFolder(folderURI + "/" + fileMask, "files");
    
for(var i in list)
    {
        var doc 
= fl.openDocument(folderURI + "/"+list[i]);
        doc.publish();
        doc.close();
        fl.trace(list[i]
+"发布完成");f
    }
}
复制代码

 


2.随机命名库元件和随机命名选中的库元件,主要解决库重名的问题,很久以前就见人用过

复制代码
代码
var lib = fl.getDocumentDOM().library;
for(var i in lib) for(var j in lib[i])
         lib[i][j].name 
= "EL_"+j+(Math.floor(Math.random()*90)+10+ '_' + (Math.floor(Math.random()*9000)+1000);

var select 
= fl.getDocumentDOM().library.getSelectedItems();
for(var i in select )
         select [i].name 
= "EL_"+ (Math.floor(Math.random()*9000)+1000+ '_' + (Math.floor(Math.random()*9000)+1000);
复制代码

 


3.清空选定的项的类链接

复制代码
代码
var lib = fl.getDocumentDOM().library.getSelectedItems();
for(var i in lib)
{
    
for(var j in lib[i])
    {
        lib[i][j].name 
= "EL_"+ (Math.floor(Math.random()*9000)+1000+ '_' + (Math.floor(Math.random()*9000)+1000);
        
if(lib[i][j].itemType=="button" && lib[i][j].linkageBaseClass==undefined)
        {
            lib[i][j].linkageExportForAS
=false;
        }
        fl.trace(
"完成清空选定的项的类链接");
    }
}
复制代码

 

 

JSFL指Flash JavaScript,是JavaScript脚本文件,是用来扩展Flash IDE的重要工具。学会它、熟练使用它之后你会惊讶的发现,哇,原来可以这么高效率的做Flash啊!下面我们来看一看怎么使用JSFL:
         不知道各位朋友有没有使用过Flash IDE中的“历史记录面板”?如果没有用过的话,赶紧Ctrl+F10调出来看一看吧,因为本文的内容将从它身上开始。
         在Flash IDE中(本人使用Flash CS3 Professional)按下R键(矩形绘制工具的快捷键),在舞台上拖动鼠标绘制出一个矩形。观察“历史记录面板”,你会发现面板中添加了一个名为“矩形”的动作。选中“矩形”动作,“历史记录面板”右下角那个磁盘图标按钮将被激活,点击该按钮保存命令为“DrawRect”。 接下来,删除刚刚在舞台上绘制的那个矩形,然后选择Flash菜单栏的 “命令”菜单,你会发现弹出菜单中多了一个名为“DrawRect”的选项,点击“DrawRect”选项看看效果吧。
         如果你以前从来没接触过JSFL,你肯定会疑问:“DrawRect”选项是怎么跑到“命令”菜单中去的?点击它后舞台上立即绘制出了一个矩形,这是什么原理?下面我们就来探索一下其中的奥秘。
         打开C:\Documents and Settings\Brant\Local Settings\Application Data\Adobe\Flash CS3\zh_cn\Configuration\Commands (注意,Local Settings文件夹默认是隐藏的,你需要显示隐藏文件才可以看到)。在这个文件夹中你会发现一个名为“DrawRect.jsfl”的文件,用文本编辑工具打开它(本人使用FlashDevelop或UtrlEdit打开),看看里面的内容,看不懂没关系,先了解一下里面的代码可以在舞台上绘制一个矩形就OK,这个东西就是jsfl。接下来,你该在Flash IDE中按F1输入“jsfl”查看一下相关帮助文档了。首先看一下有关JSFL的作用说明,然后重点关注“扩展Flas -> 对象”里的内容,看得差不多了之后,在帮助里输入“library” (或Document、Item、outputPanel等等词汇),仔细认真的看一看“扩展Flas -> 对象”里的东西。不要惊讶“居然有如此多的内容!”。嗯,这部分知识点的内容的确挺多的,都是Flash IDE的JavaScript API,使用这些API可以实现Flash IDE环境中的所有动作。要完全研究透它,需要学习一下JavaScript,不过不用紧张,很简单,因为JS跟AS基本上一样,关键字、语法、结构都是统一遵循ECMA Script标准的,跟据AS习惯,你猜着写也能写出JS代码来,学习曲线会比较平滑。好了,那些内容你自己慢慢研究吧,这里我就不等你看完,下面我将写两个简单的例子来示范一下怎么使用JSFL:
         【注】 下文中目录C:\Documents and Settings\Brant\Local Settings\Application Data\Adobe\Flash CS3\zh_cn\Configuration\Commands统一简称为Commands
示例一,BitmapBatRename(给库中的图片批量命名):
第一步:新建一个文本文档,粘贴如下代码到文档中,保存到Commands目录下,保存名字为“BitmapBatRename.jsfl”。注意扩展名是jsfl而不是txt哦。

1
2
3
4
5
6
7
8
9
10
var doc = fl.getDocumentDOM();
var uxi = doc.xmlPanel(fl.configURI + "Commands/Rename.xml");
if(uxi.dismiss == "accept")
{
         var items = doc.library.getSelectedItems();
         for(var i = 0; i<items.length; i++)
         {
                  items[i].name = uxi.prefixName + i;
         }
}


第二步:新建一个文本文档,粘贴如下代码到文档中,保存到Commands目录下,保存名字为“Rename.xml”。注意扩展名是xml哦。

<?xml version="1.0" encoding="utf-8"?>
<dialog buttons="accept,cancel" title="Bat Rename Tool">
<label value="请输入名称前缀"/>
<textbox id="prefixName"/>
</dialog>

 


第三步:新建一个Flash文档,导入一组图片到库里,选中库中的一张、几张或者全部图片,选择“命令-> BitmapBatRename”,在弹出的对话框里输入一个想要的名字,然后点击确定,看一看库中的图片的名字有什么变化。OK,示例一结束。
示例二,GetLibraryItemProperty(将库中的元件的属性输出到输出面板,并允许保存为xml):
第一步:新建一个文本文档,粘贴如下代码到文档中,保存到Commands目录下,保存名字为“GetLibraryItemProperty.jsfl”。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
var doc = fl.getDocumentDOM();
var lib = doc.library;
var items = lib.items;
fl.outputPanel.clear();
fl.trace("<?xml version=\"1.0\" encoding=\"utf-8\"?>");
fl.trace("<list>");
for(var i = 0; i < items.length; i++)
{
         var type = items[i].itemType;
         var name = items[i].name;
         var className = items[i].linkageClassName;
         fl.trace("    <item type=" + "\"" + type + "\"" + " name=" + "\"" + name + "\""+ " className=" + "\"" + className + "\"" + "/>");
}
fl.trace("</list>");
var xui = doc.xmlPanel(fl.configURI + "Commands/saveOutputPanel.xml");
if(xui.dismiss == "accept")
{
         fl.outputPanel.save(xui.url);
}


第二步:新建一个文本文档,粘贴如下代码到文档中,保存到Commands目录下,保存名字为“saveOutputPanel.xml”。

复制代码
<dialog buttons="accept, cancel" title="保存输出面板信息">
<hbox>
<label value="URL:"/>
<textbox id = "url" size="30" multiline="false"/>
<buttons="accept, cancel"/>
<hbox>
</dialog>
复制代码

 


第三步:新建一个Flash文档,导入一组图片到库里,先给它们都取上名字,添加好导出Action类,然后选择“命令-> GetLibraryItemProperty”。 在保存文件的对话框中填入文件路径,点击保存之后在指定的路径下就可以看到一个xml了, 它记录了库中所有元件的“元件类型”、“元件名称”和“链接类名”。【注意】保存文件的时候填入的文件路径的写法哦:例如,你想将生成的xml保存到F盘下的myxml文件夹中,保存的文件名为“list.xml”,则路径如下填写:file:///F|/myxml/list.xml。OK,示例二结束。
         JSFL功能很强大,更多功能请各位自己去慢慢探索,本文仅仅作为不懂的朋友入门之用。在学习JSFL的过程中有一个窍门——在IDE中随意操作,保存历史记录,然后观察生成的JSFL代码来学习。Over!

(评论功能已被禁用)
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· [AI/GPT/综述] AI Agent的设计模式综述
点击右上角即可分享
微信分享提示