【F大说】Flash的那些坑

转载自F大的自言自语←_←


创建控件类时,基类不能用源码创建控件类时,基类要以swc方式提供(不能用源码),否则控件中所包含的子元件实例名将被添加到基类,而不是控件类中去。调用gotoAndStop会导致帧代码插队执行不论调用哪个元件的gotoAndStop,都会导致当前脚本所在层级内的所有帧代码(例如组件参数设置代码)插在下一句代码前执行,从而导致初始化顺序错乱,或报对象找不到的异常。设置元件大小时,元件必须有内容当元件内容为空时,设置其width和height,会导致scaleX和scaleY变成0。控件子元件初始不能隐藏控件的子元件初始不能设为隐藏,否则运行时会出现FlashPlayer莫名其妙退出的现象(不报异常)。Chrome浏览器和其他浏览器对于字体名的识别不同大多数浏览器(包括Flash独立播放器)对于字体名是采用英文标识名的,比如宋体用的是SimSun,而Chrome浏览器采用的是字体原名,比如宋体就叫宋体。这就导致FlashIDE里编辑好的文本框设备字体,在Chrome下会不认,以至于被Chrome的默认字体代替,从而导致显示异常。要解决这个问题,可以在AS里遍历所有的文本框,强制矫正其字体格式,或统一用动态文本框设置htmlText,并在设置时多加一个<font face="字体原名">的HTML标签。文本框的默认字体会受选中内容影响当文本框有选中内容时(仅有个光标位置也一样),defaultTextFormat属性的值会变成选中内容结尾处之前那个字符的格式,而不是defaultTextFormat本来的值,只有当无选中内容时,defaultTextFormat才会变回本来的值。非动态创建的文本框的默认字体在设置htmlText后会被重置对于不是用代码new TextField创建的文本框(即在FlashIDE里添加的文本框),其defaultTextFormat属性的值会在设置了htmlText后,被重置为FlashIDE里编辑的原始字体格式。虽然大多数情况下这并不是什么问题(因为defaultTextFormat很少手动设置),但当在Chrome浏览器下播放时,就会因为Chrome浏览器不认文本框原始的英文字体标识名,而导致字体变成Chrome默认字体。解决方案:在设置htmlText前,先设个替换字符,并调用setTextFormat(当前默认字体格式)还原被重置的默认字体格式,然后再把当前htmlText内容里的替换字符替换为新的内容,这样就能保证最外层的字体格式仍然保持为当前的默认字体格式(而不是原始字体格式)。文本框设置htmlText有时会末尾多一空行将文本框的htmlText设置为不含末尾空行的值,末尾会多出一个空行。文本框直接设置缩放比例会导致文本框大小和设备字体显示不正常设备字体获取字符范围也会受缩放比例的影响,导致和实际显示的位置不符。文本框htmlText对于标签参数字符串中的特殊符号没做转义一般只会在<a href="...">中使用自定义的参数,但若参数字符串中包含"、<等HTML特殊字符,则设置给htmlText后(设置的内容中已转义为&quot;等),文本框显示效果是正常的,链接效果也对,但取文本框的htmlText值,却会发现参数字符串中的特殊符号并非以转义格式存在,这就会造成若将该htmlText赋值给其他文本框用,会因html解析错误而丢失内容。uint变量赋负值会变成大正数,而不是0实际上是先将负值转为int类型,然后再强制类型转换为uint。多个swc中有相同的类会导致只有一个有效尤其出现在swc是UI的时候,若两个UI的swc中都有同样的滚动条,则只有一个会编译成功,另一个会编译成普通的MC,并在运行时报类型转换错误。双击事件要把mouseChildren设为false时才有效当包含子元件时,光设置doubleClickEnabled为true还不够,则还需要把mouseChildren设为false,才会触发双击事件。内存回收不及时确切的来说这个不算坑,只是Flash的内存回收既不是立即执行,也不是定时执行,而是当有新的内存分配申请,且当前剩余freeMemory不够多时,才去执行一次。并且此时执行的回收,也不是显式调用System.gc()那样进行完整的回收,而是只回收一部分,只要能满足提供新的内存分配申请,就不再继续回收了。所以对于大量的内存用完后,最好显式的调用一次System.gc(),这样可以充分释放掉这些已经分配了的内存。定时器时间不准Timer定时器的每两个TIMER事件之间的时间间隔,并不等同于设定的时间间隔,而是取整数个内部时间片(时长受设定帧率影响,并不固定)后触发。事实上,Timer是在每次内部时间片处理时,检测是否已超过时间间隔,超过则触发一次TIMER事件,并重新开始计算间隔(并非累计,因此实际TIMER事件次数会少于理论次数)。Release版和Debug版中,对于局部变量和成员变量同名的处理不同var value:int = value + 1; //假设this.value原先为5。类似上述语句,在Debug版中,会被理解为var value:int; value = this.value + 1,于是value会被赋值为6。而在Release版中,会被理解为var value:int; value = value + 1,于是value会被赋值为1。重载MovieClip类的isPlaying属性,会导致UI控件预览看不见只要UI控件里包含重载了MovieClip的isPlaying属性的类,即使没调用到,也会导致所有的UI控件预览看不见,但实际运行却是正常的。

相关文章

  译序:JWMediaPlayer是开源的网页使用的Flash播放器。本...
    Flash编程原理都是只能将1写为0,而不能将0写成1.所...
 上传setenvgatewayip192.168.1.1;setenvserverip192.168.1...
Error:FlashDownloadFailed-"Cortex-M3"出现一般有...
jPlayer是一个用于控制和播放mp3文件的jQuery插件。它在后台...
#ifndef__FONTUPD_H__#define__FONTUPD_H__#include"sy...