[转]Flex加载swf的几个要点
http://www.iteye.com/topic/268779
今天折腾了大半天Flash与Flex3的配合,特总结一下心得体会:
1) 如果是通过Embed来嵌入swf的话,Flex3只支持FlashCS2所创建的swf.
2) 如果是通过loader来加载的话,只有AS3的swf才能在加载后被控制(这和第一点相反,我花了很长时间才弄明发现这两点,汗!)
3) 如果要直接加载到Flex当中,类必须继承UIComponent,这好比在Flash中必须继承DisplayObject
4) 如果要把Flash的组建打包给Flex使用,应该使用FlexComponentKit,把MC导出成swc。然后在Flex中把swc配置到Library Path后,对应的组建就可以作为一等公明在Flex中使用了。如果MC是绑定了类的,那么对应类继承UIComponent就可以了。
在googleDocs下了一个corelib包,不是蛮实用的(前段时间还自己写trim,浪费时间啊),E文看得累,以备以后查看
彻底摒弃Adobe的激活ActiveX控件的方法
大家知道,在IE中只有激活了ActiveX控件,Flash才能够与浏览者交互,否则得手动点一下激活。Flash也提供了一个很“方便”的解决方案,就是在发布swf文件的同时,发布html文件即可。这样Flash会在生成一个swf文件,一个包含swf的Html文件,和一个“AC_RunActiveContent.js”文件。Html文件通过调用AC_RunActiveContent.js,实现激活ActiveX控件。这一切都很便捷,直到你希望在html和Flash之间传递参数。
问题出现
在很多商业网站中,都涉及到用同一个Flash来显示大量不同的内容(图片,视频或产品信息等),这就需要向这个Flash传递参数。常见的传参方法有三种,但都会受到AC_RunActiveContent.js的不良影响。
1 ExternalInterface: 这是困扰我最久的一个问题。据Adobe的描述,这是最好的传参方法,能都非常自由和直接地在AS和JS之间互相传递参数或者互相调用函数。但我在使用Adobe的示例文件时发现,在IE中AS无法得到JS的返回值(ExternalInterface在IE中的Bug),经过不断的尝试才发现是AC_RunActiveContent.js在捣鬼,只要把它和html中对应代码以及<noscript></noscript>删除就一切正常了。
请看示例:
Player8,AS2: http://www.adamstudio.cn/lab/var/test/test_v8.html
Player9,AS3: http://www.adamstudio.cn/lab/var/test/test_v9.html
如果带有激活ActiveX控件的那段JS代码,IE中就无法得到返回值,请看:
http://www.adamstudio.cn/lab/var/test/test_error.html
所有源文件:http://www.adamstudio.cn/lab/var/test/test.rar
2 FlashVars:
3 URL传递参数
后两种方法受AC_RunActiveContent.js的影响更大,因为这两种方法都是在<noscript></noscript>之间加入代码,而在JS能运行的浏览器当中(绝大多数浏览器都能运行JS),这些代码根本就不会运行。所以无论在Firefox或者IE中都不起任何作用!
也就是说常用的三种在Html与AS之间传递参数的方法均受到激活ActiveX控件的那段代码的影响。所以要想在html和Flash之间传递参数,就必须摒弃Flash自带的激活ActiveX控件的方案!
替代方案:SwfObject 请参考SwfObject解决Html与Flash之间传递参数问题