2011-12-26 57 views
1

已知以下SWF: Sample當一次向文本字段添加單個字母時,如何避免單詞換行出現中間字?

通知如何與在第一行的末尾加上「愛好者」和「寫」,在第二行的端部,使得它們開始在第一鍵入出但在幾封信後,他們被撞了。

我明白這是正確的行爲,但是有沒有辦法讓「發燒友」開始在第二行輸入,並在第三行輸入「寫」,而不是在輸入過程中被碰撞?

目前我正在考慮做一個搜索提前機制,所以它會找到整個下一個單詞,然後將該活動單詞打印出來,暫時打印出來,看看它是否增加了numlines,如果它插入了換行並繼續寫作。但它似乎很乏味。下面

代碼:

import flash.text.TextField; 
import flash.events.Event; 

var tt:TextField = new TextField(); 
tt.wordWrap = true; 
tt.width = 200; 
tt.height = 50; 
tt.border = true; 

var s = "Stack Overflow is for professional and enthusiast programmers, people who write code because they love it. We feel the best Stack Overflow questions have a bit of source code in them, but if your question generally covers"; 
addChild(tt); 

var currentLetter:int = 0; 

addEventListener(Event.ENTER_FRAME, onEnter, false, 0, true); 

function onEnter(e:Event):void 
{ 
    if(currentLetter < s.length) 
    { 
     tt.appendText(s.charAt(currentLetter)); 
    } 
    currentLetter++; 
} 
+0

,如果他們所橫空出世是不需要換行的簡短單詞(例如'writ'或'enthuse')?您正在要求系統預測在鍵入之前要輸入的單詞。整潔的把戲,如果你可以把它關閉。 – 2011-12-26 01:00:14

+0

是的,它也需要用較短的單詞來處理,否則我顯然會把手動換行符。這將是一個巧妙的把戲,顯然是在可能的領域 – Chris 2011-12-26 02:08:55

+0

有沒有辦法計算一個文本的寬度像素線?如果是這樣,你可以有一個單獨的字段(用戶不可見)與下一個單詞,計算其寬度,添加到主字段的當前行的寬度,添加一個空格,並查看它是否比字段寬。 – 2011-12-26 04:09:48

回答

1

調整你的代碼了一下,貼在wonderfl結果:http://wonderfl.net/c/rZkm

爲@mouseas建議我把下一個單詞到額外的文本字段測量寬度和比較這到當前行中的剩餘空間......如果下一個單詞不適合我添加換行並繼續。

下面的代碼:

package { 
    import flash.geom.Rectangle; 
    import flash.text.TextFieldAutoSize; 
    import flash.display.Sprite; 
    import flash.text.TextField; 
    import flash.events.Event; 

    public class FlashTest extends Sprite { 

     private var currentLetter:int = 0; 
     private var tt:TextField; 
     private var debug:TextField; 
     private var pre:TextField; 
     private var s:String; 

     public function FlashTest() 
     { 
      // write as3 code here.. 
      tt = new TextField(); 
      tt.wordWrap = true; 
      tt.width = 200; 
      tt.height = 150; 
      tt.border = true; 

      s = "Stack Overflow is for professional and enthusiast programmers, people who write code because they love it. We feel the best Stack Overflow questions have a bit of source code in them, but if your question generally covers"; 
      addChild(tt); 

      // predraw word 
      pre = new TextField(); 
      pre.y = 150; 
      pre.width = 200; 
      pre.height = 50; 
      pre.autoSize = TextFieldAutoSize.LEFT; 
      pre.border = true; 
      addChild(pre); 

      // debug txt 
      debug = new TextField(); 
      debug.x = 250; 
      debug.wordWrap = true; 
      debug.width = 200; 
      debug.height = 500; 
      debug.border = true; 
      addChild(debug); 

      addEventListener(Event.ENTER_FRAME, onEnter, false, 0, true); 
     } 

     private function onEnter(e:Event):void 
     { 

      //debug.appendText("char: " + rect.x + " " + rect.width + "\n"); 
      var c:String = ""; 
      if (currentLetter < s.length) 
      { 
       c = s.charAt(currentLetter); 
       tt.appendText(c); 
      } 
      else 
      { 
       debug.appendText("DONE! \n"); 
       removeEventListener(Event.ENTER_FRAME, onEnter);  
      } 

      if (c == " ") 
      { 
       var rect:Rectangle = tt.getCharBoundaries(currentLetter-1); 
       if (rect != null) 
       { 
        //debug.appendText("char: " + rect + "\n"); 
        var cPos:int = rect.x + rect.width; 
        var r:int = tt.width - 4 - cPos; // 4px for gutter on left+right side of textfield 



        var start:int = s.lastIndexOf(" ", currentLetter); 
        var end:int = s.indexOf(" ", currentLetter+1); 
        if (start < 0) start = 0; 
        pre.text = s.substr(start, end-start); 

        debug.appendText("rest: " + r + " " + pre.textWidth + " > " + pre.text + "\n"); 

        if (r - pre.textWidth <= 0) 
        { 
         tt.appendText("\n"); 
         debug.appendText("\n"); 
        } 

        //debug.appendText("w:" + tt.textWidth + " " + start + "->"+ end + " /" + pre.text + "/ " + pre.textWidth + "\n"); 
       } 
      } 

      ++currentLetter; 
     } 
    } 
} 

的偉大工程 - 只有「一個」,在4號線製造麻煩 - 也許你需要微調的計算有點...

相關問題