2012-09-27 58 views

回答

0

如果您使用等寬字體,您可以獲得一些信息,例如在答案框中使用的字體。要獲取插入位置,有caretIndex屬性可以讀取它。您可以使用text屬性在文本字段中對換行進行編號,以便在(行,列)系統中獲得兩個座標。然後,使用scrollHscrollV來確定文本字段的內容滾動多少,然後從座標中減去它們,然後將它們乘以一個符號的寬度和高度。但是,如果您的文本字段使用可變符號寬度的TrueType字體,則所有這些都不起作用。您可以獲得的最佳效果是當前高度,如果一行文本在整個文本字段中保持不變,則爲高度。

編輯:在文本字段的wordWrap屬性爲true時,正確的高度取決於該文本字段的寬度。您可以嘗試以下操作:

 var storeText:String = tf.text.slice(); 
     var lineHeight:Number; 
     if (tf.numLines == 0) lineHeight = 1; 
         else lineHeight = tf.textHeight/tf.numLines; 
     tf.text=storeText.slice(0, tf.caretIndex); 
     var m:int = tf.numLines-tf.scrollV; 
     trace(m*lineHeight); 
     tf.text = storeText; 

該方法相當愚蠢,涉及更改文本屬性的文本字段兩次,這很慢。這將返回當前行從文本字段頂部偏移的數字。我希望這是你需要知道的。如果您想知道未滾動文本頂部的相對位置,請忽略tf.scrollV。

+0

其實我在經過一番思考之後只需要y的位置。你能解釋一下怎麼做嗎?我有點學習AS3。 – user1133188

+0

你的文本字段是否有wordWrap屬性爲true? – Vesper

+0

是的,它是真的。 – user1133188

1

檢查文檔中的Texfield.caretIndex屬性和TextField.getCharBoundaries()方法。這實際上很簡單,但當字段爲空或下一個字符爲空/換行符時會變得棘手。

import flash.text.TextField; 
import flash.text.TextFormat; 
import flash.text.TextFieldType; 
import flash.events.KeyboardEvent; 
import flash.geom.Rectangle; 

var t:TextField = new TextField(); 
t.x = t.y = 20; 
t.width = 200; 
t.height = 100; 
t.multiline = t.wordWrap = t.border = true; 
t.defaultTextFormat = new TextFormat('_sans',20); 
t.type = TextFieldType.INPUT; 
addChild(t); 
stage.focus = t; 
t.addEventListener(KeyboardEvent.KEY_DOWN,kd); 

function kd(e:KeyboardEvent):void { 
    if (!e.ctrlKey) return; 
    var car:int = t.caretIndex; 
    var rect:Rectangle = t.getCharBoundaries(car); 
    if (rect == null) { 
     trace('caret:'+car,'need to calculate this possibility') 
    } else { 
     trace('caret:'+car,rect,'(relative to textfield)'); 
    } 
} 
+0

謝謝,這是完美的,當它實際上工作,哈!無論如何不能讓它始終工作嗎?不可能在我的車廂之間放置兩個「A」或其他物品? – user1133188

+0

當然,你可以做到這一點。如果rect爲空,則追加A,將選擇內容設置爲caret-1,再次計算rect,然後刪除以下額外的A字符。 – inhan

+0

看來我還是發明了一輛自行車......很好找,謝謝。 – Vesper