我需要在输入文本字段中获取插入符号的位置。我不需要设置位置,我需要获取插入符号的当前位置。无法弄明白,这让我发疯!
答案 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
属性在文本字段中编号换行,这样就可以在(行,列)系统中获得两个坐标。然后,使用scrollH
和scrollV
确定文本字段内容滚动的距离,并从坐标中减去它们,然后将它们乘以一个符号的宽度和高度。但是,如果您的文本字段使用可变符号宽度的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。