入力テキストフィールドでキャレットの位置を取得する必要があります。位置を設定する必要はありません。キャレットの現在の位置を取得する必要があります。これを理解できず、それは私を夢中にさせています!
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)');
}
}
回答ボックスで使用されているような等幅フォントを使用している場合は、いくつかの情報を取得できます。キャレットの位置を取得するには、caretIndex
それを読み取るプロパティがあります。プロパティを使用text
してテキストフィールドの改行に番号を付けることができるため、(行、列) システムで 2 つの座標を取得できます。次に、scrollH
とscrollV
を使用して、テキストフィールドの内容がスクロールされた距離を決定し、それらを座標から差し引いてから、1 つのシンボルの幅と高さを掛けます。ただし、テキストフィールドでシンボル幅が可変の TrueType フォントを使用している場合、これはすべて機能しません。1行のテキストがテキストフィールド全体で一定である場合の高さとして、取得できる最高のものは現在の高さです。
編集: テキスト フィールドの 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;
この方法はややばかげており、テキスト フィールドのテキスト プロパティを 2 回変更する必要があり、処理が遅くなります。これは、テキストフィールドの上部からの現在の行のオフセットである数値を返します。これがあなたが知る必要があることだと思います。スクロールされていないテキストの上からの相対位置を知りたい場合は、tf.scrollV を無視してください。