1

我需要在我的输入文本字段中获取插入符号的位置。我不需要设置位置,我需要获取插入符号的当前位置。无法弄清楚这一点,这让我发疯!

4

2 回答 2

2

检查文档中的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)');
    }
}
于 2012-09-27T18:30:15.720 回答
0

如果您使用的是等宽字体,您可以获得一些信息,例如答案框中使用的字体。要获得插入符号位置,caretIndex需要读取它的属性。您可以使用text属性对文本字段中的换行符进行编号,因此您可以从中获取(行,列)系统中的两个坐标。然后,使用scrollHscrollV确定文本字段的内容滚动了多远,并从坐标中减去它们,然后将它们乘以一个符号的宽度和高度。但是,如果您的文本字段使用可变符号宽度的 TrueType 字体,所有这些都将不起作用。你能得到的最好的是当前高度,如果一行文本在整个文本字段中是恒定的,则高度。

编辑:文本字段的 wordWrap 属性为真,正确的高度取决于该文本字段的宽度。您可以尝试以下方法:

        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。

于 2012-09-27T18:07:58.843 回答