Flash:TextField字體不顯示/文字不顯示/文字丟失


節約大家時間,先說結論:

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、最根本!避免這種動態修改文字的方式,改為換一幀,或者換個圖片。
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM