+ -
当前位置:首页 → 问答吧 → 如何用jsfl来写个遍历fla檔中所有文本的程序?

如何用jsfl来写个遍历fla檔中所有文本的程序?

时间:2009-06-09

来源:互联网

我的思路是这样的,我希望通过用JSFL把fla档案中所有的文本取出来。看了半天的扩展flash里面的内容,没有发现可以用的命令,还请高手给指点下。谢谢!!

作者: QWEASZ   发布时间: 2009-06-09

用C写个了 放DLL里 然后用JSFL调用

作者: JoesonWong   发布时间: 2009-06-09

引用:
原帖由 JoesonWong 于 2009-6-9 14:45 发表
用C写个了 放DLL里 然后用JSFL调用
我看flash本身的搜素與取代功能很不錯,group中的文本都可以搜素出來.但就是不能批量搜素.或者扩展下里面的功能了.
DLL怎么用,还请JoesonWong君给指点下了。我是直接学习的as所以对其他的不怎么懂了.谢谢!!

作者: QWEASZ   发布时间: 2009-06-09

眼看着帖子就要沉下去,但问题还没有解决,急啊,就没有人用过吗,我只想用jsfl来搜素flash文件中的字符串,比如"你好",但是看了半天的扩展文档还试没有发现相关的命令可用.请高手指点啊

作者: QWEASZ   发布时间: 2009-06-10

额.. 我也是才看帮助文档 里面说支持C,C++写的动态链接库(*.dll)  c貌似些个遍历目录没问题吧

作者: JoesonWong   发布时间: 2009-06-10

直接生成swf后 用闪客精灵打开 浏览文本那里 可以整段复制出来的

作者: HSZZLZL   发布时间: 2009-06-10

引用:
原帖由 HSZZLZL 于 2009-6-10 16:43 发表
直接生成swf后 用闪客精灵打开 浏览文本那里 可以整段复制出来的
我刚试了,发现生成好多的文本的,也可以。
但我更想比如搜一个字符"我们的家乡",搜到后替换成"我们的国家",
如果是单个的话,用flash自己的搜素与取代就可以了,但我想批量的操作,比如让它可以读取一个xml档,根据xml批量转换。

作者: QWEASZ   发布时间: 2009-06-10

引用:
原帖由 QWEASZ 于 2009-6-10 17:00 发表

我刚试了,发现生成好多的文本的,也可以。
但我更想比如搜一个字符"我们的家乡",搜到后替换成"我们的国家",
如果是单个的话,用flash自己的搜素与取代就可以了,但我想批量的操作,比如让它可以读取一个xml档,根据x ...
其实就是操个DOM结构罢了 你看看帮助吧 反正我感觉上应该不难

作者: HSZZLZL   发布时间: 2009-06-10

引用:
原帖由 HSZZLZL 于 2009-6-10 17:05 发表


其实就是操个DOM结构罢了 你看看帮助吧 反正我感觉上应该不难
HSZZLZL兄,我也看了半天,发现没有这方面的命令啊,难到?论坛里面那位大哥做过这方面得东西啊,指点下了。
基本思路:
提供一个字符“XX”,然后在文中搜索所有有这个字符的部分.

作者: QWEASZ   发布时间: 2009-06-10

复制内容到剪贴板
代码:
var lib = fl.getDocumentDOM().library;
for(var i in lib){
for(var j in lib[i]){//遍历所有库元件
if(lib[i][j].itemType=="graphic"||lib[i][j].itemType=="movie clip"){//判断,只有图形元件和影片元件里含有文本
for(var k in lib[i][j].timeline.layers){//遍历图层
for(var n in lib[i][j].timeline.layers[k].frames){//遍历所有帧
for(var m in lib[i][j].timeline.layers[k].frames[n].elements){//遍历所有帧里的可视元素
if(lib[i][j].timeline.layers[k].frames[n].elements[m] == "[object Text]"){//只有文本才执行下面的操作
if(lib[i][j].timeline.layers[k].frames[n].elements[m].getTextString()=="我们的家乡"){//获取你需要操作的字符
lib[i][j].timeline.layers[k].frames[n].elements[m].setTextString("我们的国家");//替换字符
}
}
}
}
}
}
}
}
上午临时写的,我这里测试也只是在库里弄了几个元件,至于主场景里的文本遍历是一样的,我留给你自己思考了.关键词fl  getDocumentDOM()后面的操作可以参考上面的

[ 本帖最后由 libins 于 2009-6-11 11:04 编辑 ]

作者: libins   发布时间: 2009-06-11

先謝謝libins斑竹了,我自己再看下了,非常感謝。

作者: QWEASZ   发布时间: 2009-06-11

首先非常感谢libins斑竹了,非常不错,看完以后一下就有思路了.
但刚看了下发现如果文本是在Group中的话,就没有办法获取了,
我刚trace了下.( 原来不明白"[object Shape]"哪里来的,从来没有看见,通过trace后才发现,终于学习了);
fl.trace(lib[i][j].timeline.layers[k].frames[n].elements[m]);
结果:
[object Text]

function (keya, keyb) {
    var comparisonFunction = function (a, b) {var ta = a[keya];var tb = b[keya];if (ta < tb) {return -1;}if (ta > tb) {return 1;}var tc = a[keyb];var td = b[keyb];if (tc < td) {return -1;}if (tc > td) {return 1;}return 0;};
    this.sort(comparisonFunction);
}

[object Shape]

function (keya, keyb) {
    var comparisonFunction = function (a, b) {var ta = a[keya];var tb = b[keya];if (ta < tb) {return -1;}if (ta > tb) {return 1;}var tc = a[keyb];var td = b[keyb];if (tc < td) {return -1;}if (tc > td) {return 1;}return 0;};
    this.sort(comparisonFunction);
}
除了[object Text]以外就是[object Shape]了,
在用lib[i][j].timeline.layers[k].frames[n].elements[m].isGroup发现是个Group,
遍历了下里面的东东:
结果如下:
false
shape



true
false

0
0
159.95000000000002
38
[object Object]
2
[object Layer]
true
后面窝也遍历了下,没有发现text了,是不是我方法不对还是Group中文本确实没有办法找到了?

作者: QWEASZ   发布时间: 2009-06-11

组的话,既然可以遍历,你试试用数组的方式去读取,把符合的文本弄出来

作者: libins   发布时间: 2009-06-11

数组的方式?
for (var g in lib[i][j].timeline.layers[k].frames[n].elements[m]){
if(lib[i][j].timeline.layers[k].frames[n].elements[m][g] =="[[object Text]
){
dosomething.
}

}

作者: QWEASZ   发布时间: 2009-06-11

for (var g in lib[i][j].timeline.layers[k].frames [n].elements[m])
{
   fl.trace(lib[i][j].timeline.layers[k].frames[n].elements[m][g] );
   //以下是輸出結果:
  /*shape
     true
     false
     0
     0
     23
     20
     [object Object]
     2
     [object Layer]
     true
     */
   if(lib[i][j].timeline.layers[k].frames[n].elements[m][g] =="[[object Text]")
  {
           dosomething.
   }

}
我把那个组给遍历了下,在输出结果页没有[object Text],但事实上文本确实在组里面。
不知道是不是我的方式不对?ibins斑竹,麻烦在给指点下。谢谢!!

作者: QWEASZ   发布时间: 2009-06-12

如果是组的话,你要对它进行判断,符合你的要求前提是Shape,而且是组,isGruop
(..elements[m] =="[object Shape]"&&..elements[m]==isGroup)
上面就是判断了,只有图形并且是组的话,才执行后面的遍历
for(var w in ...elements[m].contours)//contours就是返回这个组里的对象的个数了
var item = ....elements[m][w]; //这个东西很奇怪了。。如果这样定义的话,它回对组里的情况判断,如果是shape就返回shape,不是的话就返回false了
所以我们就对item判断了,因为是要取text,所以
if(item!="shape")
如果执行到这里了,就是我们需要的对象了,可是item是false。。。你可以考虑换个访问方式去读这个对象,elements[m].contours[w]这个返回的是Contour 对象,具体你可以看帮助了,它有好多种对象返回的类型,但是貌似都不能返回Text类型,转型操作的话,JSFL里好像不支持。。所以你自己思考下吧 我有空也弄弄~
还有你做这个的用途是什么?如果是希望JSFL来弄的话,最好是有一定规律的,否则都是白费,因为fla里的图形结构本来就多,你弄了组,万一又嵌套组。。呵呵,就麻烦了

作者: libins   发布时间: 2009-06-12

if (lib[i][j].timeline.layers[k].frames[n].elements[m] == "[object Shape]")
{
    fl.trace(lib[i][j].timeline.layers[k].frames[n].elements[m].isGroup);
    //true;
    if (lib[i][j].timeline.layers[k].frames[n].elements[m].isGroup)
    {
          for (var s in lib[i][j].timeline.layers[k].frames[n].elements[m].contours)
          {
             fl.trace(lib[i][j].timeline.layers[k].frames[n].elements[m].contours[s]);
             //輸出結果:
             /*
           function (keya, keyb)
          {
          var comparisonFunction = function (a, b) {var ta = a[keya];var tb = b[keya];if (ta < tb) {return -1;}if (ta > tb)  
          {return 1;}var tc = a[keyb];var td = b[keyb];if (tc < td) {return -1;}if (tc > td) {return 1;}return 0;};
           this.sort(comparisonFunction);
           }
          */
           }
      }
}
輸出結果是:
function (keya, keyb)的东西,
没有对象返回的类型了。
我见flash自身的搜索与取代,我随便把文本放到好几层的组里面,仍旧可以搜索出来。感觉蛮神奇的。可惜自己目前在程序方面,也只是对flash as有所了解了。通过斑竹的指点,我感觉通过讨论,再自己实践。这两天对flash扩展这方面的东西,明显的认识提高了。非常感谢,湘农斑竹的耐心解答了。
对于目前这个我只是个想法,只是打算如果可以提出文本的话,想文本进行批量的设置了。

作者: QWEASZ   发布时间: 2009-06-12

搜素文本現在有問題;不知道是不是jsfl的一個bug.
fl.trace(lib[i].timeline.layers[k].frames[n].elements[m])
//結果為[object Text];
fl.trace(lib[i].timeline.layers[k].frames[n].elements[m].elementType)
//結果為undefinded;
var text_str = lib[i].timeline.layers[k].frames[n].elements[m].getTextString();
fl.trace(text_str);
//出現警告: lib[i].timeline.layers[k].frames[n].elements[m].getTextString() is not a function;

可實際上我裏面上的確實有text的.這種情況是在下麵這段腳本執行好幾次后就出現;之前是正確的;
复制内容到剪贴板
代码:
var lib = fl.getDocumentDOM().library.items;
for (var i in lib) {
    //遍历所有库元件
    if (lib[i].itemType == "graphic" || lib[i].itemType == "movie clip") {
        //判断,只有图形元件和影片元件里含有文本
        for (var k in lib[i].timeline.layers) {
            //遍历图层
            for (var n in lib[i].timeline.layers[k].frames) {
                //遍历所有帧
                for (var m in lib[i].timeline.layers[k].frames[n].elements) {
                    //遍历所有帧里的可视元素
                    if (lib[i].timeline.layers[k].frames[n].elements[m] == "[object Text]") {
                        //只有文本才执行下面的操作
                        if (lib[i].timeline.layers[k].frames[n].elements[m].getTextString() == "我们的家乡") {
                            //获取你需要操作的字符
                            lib[i].timeline.layers[k].frames[n].elements[m].setTextString("我们的国家");//替换字符
                        }
                    }
                }
            }
        }
    }
}
現在是腳本一會能用一會不能用的; 出現上面那樣問題;實在找不到問題,推到出的結果很矛盾;既然是[object Text];可爲什麽又沒有getTextString() 這個方法呢?
查看幫助element.elementType
唯讀屬性;字串;代表指定元素的類型。此值為下面其中之一:"shape"、"text"、"instance" 或 "shapeObj"。"shapeObj" 是使用可擴充工具建立的。
但輸出結果卻為undefined; 不明白.
我也嘗試輸出其他的屬性值
fl.trace(lib[i].timeline.layers[k].frames[n].elements[m].x)
結果也是undefined;
最後得出的結果我覺得lib[i].timeline.layers[k].frames[n].elements[m]就不是element類型;
而且只有文本找不到,圖形都可以的;
爲什麽呢?是官方的bug嗎?
還試搜素腳本寫的有問題;請會用jsfl的高手給指點下了。不勝感激!!
libins斑竹再次請你幫忙在看下了! 謝謝!!

[ 本帖最后由 QWEASZ 于 2009-7-7 09:59 编辑 ]

作者: QWEASZ   发布时间: 2009-07-07

这个讨论不错 刚要用到jsfl更改文本

作者: HSZZLZL   发布时间: 2010-08-03

天杀的 几百个的文本 每一帧上都要编辑 累得我只好向jsfl求助了

根据ls ls ls ls 不知几楼的ls 的脚本参考 自己试验了 呵呵 开心啊


每一关键帧上有一个文本框 帧与帧间隔一个F5


//fl.getDocumentDOM().getTimeline().convertToBlankKeyframes();
//http://bbs.blueidea.com/thread-2932659-1-1.html


var a = ["碘的萃取和分液","硫酸根离子的检验","配制一定物质的量浓度的溶液","丁达尔现象","离子反应的条件","NaAlO2与盐酸的反应","NaOH与氯化铝的反应","铝和盐酸、氢氧化钠的反应","铝热反应","氯化铝与NaOH的反应","钠与水的反应","钠与氧气的反应","氢氧化铝的生成和性质","碳酸钠、碳酸氢钠与盐酸反应","碳酸钠与碳酸氢钠的热稳定性","碳酸钠与碳酸氢钠的水溶性","铁的氢氧化物","铁粉与水蒸气的反应","铁盐和亚铁盐","盐酸与NaAlO2的反应","焰色反应","氨气的制取二","氨气的制取三","氨气的制取一","二氧化硫的性质","干燥的氯气能否漂白物质","海带中提取碘","氯离子的检验","氯水的漂白作用","浓硫酸与铜的反应","喷泉实验","氢气与氯气的反应","硝酸与铜的反应","蔗糖碳化现象","钾与水的反应","钾与氧气的反应","卤素单质间的置换反应","镁、铝和盐酸的反应","镁、铝与水的反应","钠与氯气的反应","氢氧化钡晶体与氯化铵晶体反应","盐酸与铝反应","盐酸与氢氧化钠反应","原电池","中和热的测定","苯的化学性质","苯的加成反应","苯的取代反应","苯的燃烧","苯的物理性质","苯的硝化反应","苯酚与氯化铁溶液的反应","苯酚与氢氧化钠的反应","苯酚与溴水的反应","蛋白质的特征反应","淀粉的特征反应","甲烷的结构","甲烷的取代反应","甲烷的实验室制备","甲烷的稳定性","甲烷的氧化反应","葡萄糖与新制氢氧化铜反应","葡萄糖与银氨溶液的反应","乙醇的催化氧化","乙醇的燃烧","乙醇与钠的反应","乙醇与重铬酸钾的反应","乙酸的酸性","乙酸的酯化反应","乙烯的加成反应","乙烯的实验室制法","乙烯的氧化反应","蔗糖的水解"];

for(var i=0;i<a.length;i++){
       fl.getDocumentDOM().getTimeline().insertFrames();
       //fl.getDocumentDOM().getTimeline().convertToKeyframes();
       fl.getDocumentDOM().getTimeline().insertFrames();
       fl.getDocumentDOM().getTimeline().currentFrame++
       fl.getDocumentDOM().getTimeline().convertToKeyframes();
       fl.getDocumentDOM().getTimeline().layers[0].frames[(fl.getDocumentDOM().getTimeline().currentFrame)].elements[0].setTextString(a[i])
       
}

作者: HSZZLZL   发布时间: 2010-10-15

除了遍历还是遍历

作者: HBrO   发布时间: 2010-10-15

热门下载

更多