節約大家時間,先說結論:
1、是否文字中包含了\r\n等字符,flash中,\r和\n都會換行。需要過濾掉其中1個
2、是否文本框大小不夠,文字被擠到下一行了。設置單行、多行
3、TextField使用了抗鋸齒,需要嵌入字體,但動態變化的文字並不在嵌入的文字中。這個具體不說了,不懂的就得回去補課了。
4、是否文本框使用嵌入字體,但需要顯示的文字卻又沒有包含在字體中。
還有一種比較特殊的情況,就是嵌入了2個字體(例如兩個swc),重復導入了同樣的字體,較小的那一個可能覆蓋了大的那個。導致無法顯示。
5、最后最奇葩。。。嵌入swf到html中時,是否沒有設置wmode節點。嘗試調整wmode,試試window、opaque、transparent。
主要是有可能在某些webkit下出現問題(例如qq客戶端自帶的),出現文本變白,跟背景混在一起。
=======================================================
關於第4點,這里是非常奇怪的現象,需要做個實驗來給大家說明一下。另外可以參考yboy的文章:http://riaoo.com/?p=2401
如果flash程序嵌入了多個swc,而這些swc如果嵌入一樣的字體會導致沖突。
如果兩個嵌入的字還不相同,貌似flash builder會傾向於只保留少的那個。但反正不能允許這種情況出現了。
實驗驗證:
1、首先做兩個fla,導出swc和swf,一個叫font1,一個叫font2,分別嵌入“一二三四”和“一二三四五六”。需要注意的是,動態文本寫死的那幾個字,也會自動被嵌入(如果不是選“設備字體”)。
SWF的結構:場景中放一個元件,元件導出as鏈接,元件的子元件是TextField

2、編寫fb代碼,如下所示,實現三種加載方式。
[ Embed(source= "../lib/font1.swf" )] private var Font1:Class; [ Embed(source= "../lib/font2.swf" )] private var Font2:Class; public function Test2() { //第一種嵌入方式(運行時加載swf) var loader1:Loader = new Loader(); loader1.load( new URLRequest("font1.swf"), new LoaderContext(false , ApplicationDomain.currentDomain)); addChild(loader1); var loader2:Loader = new Loader(); loader2.load( new URLRequest("font2.swf"), new LoaderContext(false , ApplicationDomain.currentDomain)); addChild(loader2); loader2.x = 300; setTimeout( function():void{ TextField(MovieClip(MovieClip(loader1.content). getChildAt(0)).getChildAt (0)).text = "一二三四五六" ; TextField(MovieClip(MovieClip(loader2.content). getChildAt(0)).getChildAt (0)).text = "一二三四五六" ; }, 1000); //第二種嵌入方式(加入swc) var text1:MovieClip = new TestFont1(); addChild(text1); text1.y = 50; TextField(text1. getChildAt(0)).text = "一二三四五六"; var text2:MovieClip = new TestFont2(); addChild(text2); text2.x = 300; text2.y = 50; TextField(text2. getChildAt(0)).text = "一二三四五六"; //第三種嵌入方式(編譯時嵌入swf) var text3:MovieClip = new Font1(); addChild(text3); text3.y = 100; var text4:MovieClip = new Font2(); addChild(text4); text4.x = 300; text4.y = 100; setTimeout( function():void{ //text3是封裝的一個殼,子元件是loader,loader里邊才是這個swf Object(text3).getChildAt(0).content. getChildAt(0).getChildAt(0).text = "一二三四五六" ; Object(text4).getChildAt(0).content. getChildAt(0).getChildAt(0).text = "一二三四五六" ; }, 1000);
上述代碼會產生這樣的效果:(第一行是load swf的方式,第二行是直接引入swc再編譯,第三行是嵌入swf)


我們看第一行和第三行,font1因為只嵌入了“一二三四”,所以無法顯示“五六”,但font2沒有受到影響。但第二行,font1和font2都只能顯示“一二三四”,這里邊定有乾坤。
反編譯結果swf可以發現,引入swc的方式,雖然fb還是生成了兩個字體,但是實際運行的時候,只索引了第一個字體,第二個就被忽略了,所以“五六”沒有顯示。
根據yboy的記錄,我這里
嘗試把font1的TextField設置為“設備字體”,情況更極端了。


(第二行)font1直接嵌入了一個沒有字的字體,導致font2完全不顯示的。正如yboy說的,
“嵌入了一個沒有字的字體和沒有嵌入字體是大大不同的”。沒有嵌入字體就不會影響font2了,正是font1嵌入了字體,但卻不帶任何字,導致問題發生。
避免這個問題的方式:
1、改為加載多個swf的方式,不要引入多個swc;
2、如果必須引入多個swc,約定只在一個swc中嵌入字體;
3、最根本!避免這種動態修改文字的方式,改為換一幀,或者換個圖片。