【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后(設置的內容中已轉義為"等),文本框顯示效果是正常的,鏈接效果也對,但取文本框的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控件預覽看不見,但實際運行卻是正常的。
轉載于:https://blog.51cto.com/cstar/1915904
總結
以上是生活随笔為你收集整理的【F大说】Flash的那些坑的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: unity3d Json解析工具类
- 下一篇: GoLang学习笔记——data_typ