在输入TextField AS3中获取插入位置(x,y)?

时间:2012-09-27 17:45:17

标签: actionscript-3 textfield caret

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

2 个答案:

答案 0 :(得分: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)');
    }
}

答案 1 :(得分: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。