本座最近做的这个数据可视化项目中, 要显示中文,并且是要抗锯齿的,于是嵌入了一整个字体文件 ,结果导致编译出的swf文件达到4M。于是 就要另外做个载入器,这个载入器用来载入 主要的那个4M的swf文件,并且显示出进度条表示载入进度。
对于 上面这个需求,按照网络上搜到的方法去搞就行了。
然而 actionscript3中的一个坑卡了本座一下。
在主要的swf文件中,要用到滚动条 ,于是直接使用了fl.containers.ScrollPane,并且按照 要求把FlashControls.swc加到项目的库中了。 在只打开并且显示此主swf文件的情况下,一切正常。
当本座使用载入器swf文件来载入主swf文件时,问题就有了。 这种情况下,滚动条容器不会正常显示。使用调试版的flash播放器来打开时会报告说:
TypeError: Error #1009: Cannot access a property or method of a null object reference.
at fl.containers::ScrollPane/drawBackground()
at fl.containers::ScrollPane/draw()
at fl.core::UIComponent/callLaterDispatcher()
查了大概2个小时,本座得到的结论就是,这是actionscript3中的一个坑。
第一 点,这里的网页说到了,遇到上面那个报错,表示妳的项目里没有加上FlashControls.swc,从目前的情况来看,这个作者说得对。 http://www.evontech.com/login/topic/1014.html
第二 点,这里的网页中,作者 提出一个问题: 当被载入的swf文件中使用了ScrollPane时,是不是负责载入工作的swf里也必须把ScrollPane的控件加到项目里去?从目前的情况来看,这个问题的答案是:是。 http://stackoverflow.com/questions/2668564/scrollpane-component-required-in-library-even-though-it-is-not-being-used-by-par
那么碰到 这种情况 该 怎么解决呢?本座是这样解决的:
主要的swf不用做什么修改,因为它的功能本来就是正常的。 在负责载入主swf的那个小swf 的主类 中,声明 一个类型为ScrollPane 的成员变量, 但 不使用它,并且要把FlashControls.swc加入到小swf的项目中 ,这样ScrollPane相关代码会被编译到小swf中去。 再试试看,妳会发现已经能够正常载入大的swf并且显示了。
HxLauncher: Launch Android applications by voice commands