【问题标题】:Get caret position (x, y) in input TextField AS3?获取输入TextField AS3中的插入符号位置(x,y)?
【发布时间】:2012-09-27 17:45:17
【问题描述】:

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

【问题讨论】:

    标签: actionscript-3 textfield caret


    【解决方案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)');
        }
    }
    

    【讨论】:

    • 谢谢,当它真正起作用时,它就完美了,哈哈!无论如何都不能让它一直工作吗?是不是可以在我的车组之间放两个“A”或其他任何东西?
    • 当然你可以做到这一点。如果rect为null,则追加A,将selection设置为caret-1,再次计算rect然后删除以下多余的A字符。
    • 看来我又在发明自行车了……太好了,谢谢。
    • 虽然有可能的复杂解决方案,但应考虑每一个。我曾经为自己写了一个类,在必要时“绘制”不可见字符(用于空格、制表符和换行符的字符),我记得我花了很长时间来计算那些意想不到的可能性。
    【解决方案2】:

    如果您使用的是等宽字体,例如在答案框中使用的字体,您可以获得一些信息。要获得插入符号的位置,有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。

    【讨论】:

    • 其实我经过一番思考只需要y位置。你能解释一下如何做到这一点吗?我正在学习 AS3。
    • 您的文本字段是否将 wordWrap 属性设置为 true?
    猜你喜欢
    • 1970-01-01
    • 2019-04-20
    • 1970-01-01
    • 2020-10-29
    • 2010-10-06
    • 2011-06-23
    • 1970-01-01
    • 1970-01-01
    • 2010-12-26
    相关资源
    最近更新 更多