Найдите слово, над которым наведена мышь, для компонента «Текст» (Flex / Actionscript)

StackOverflow https://stackoverflow.com/questions/811595

Вопрос

Можно ли (если да, то как) узнать, над каким словом находится курсор / мышь, когда он перемещается над < mx: Text > составная часть? Так, например, когда пользователь перемещает мышь вдоль предложения (внутри текстового компонента), каждое слово будет выделяться по мере их появления (я знаю, что вы можете выделить, нажимая кнопку мыши вниз - но это не так, как я хочу это сделать).

Спасибо за любую информацию.

Это было полезно?

Решение

Вот один из способов сделать это: вам нужно создать свой собственный компонент, который расширяет компонент mx: Text. Я использовал MyText в этом примере. Вот полный код для <=>:

<?xml version="1.0" encoding="utf-8"?>
<mx:Text xmlns:mx="http://www.adobe.com/2006/mxml" mouseMove="onMouseMove(event)" initialize="init()">
    <mx:Script>
        <![CDATA[

            // Text formats
            private var normalTextFormat:TextFormat;
            private var highlightTextFormat:TextFormat;

            // Saved word start and end indexes
            private var wordStartIndex:int = -1;
            private var wordEndIndex:int = -1;

            private function init():void
            {
                normalTextFormat = textField.getTextFormat();
                normalTextFormat.color = 0;
                highlightTextFormat = textField.getTextFormat();
                highlightTextFormat.color = 0xFF0000;
            }

            private function onMouseMove(event:MouseEvent):void
            {
                // Clear previous word highlight
                textField.setTextFormat(normalTextFormat, wordStartIndex, wordEndIndex);

                var charIndexUnderMouse:int = textField.getCharIndexAtPoint(event.localX, event.localY);
                wordStartIndex = charIndexUnderMouse;
                wordEndIndex = charIndexUnderMouse;

                // Find start of word
                while (text.charAt(wordStartIndex) != " " && wordStartIndex > 0)
                {
                    wordStartIndex--;
                }

                // Find end of word
                while (text.charAt(wordEndIndex) != " " && wordEndIndex < text.length)
                {
                    wordEndIndex++;
                }

                // Highlight character
                textField.setTextFormat(highlightTextFormat, wordStartIndex, wordEndIndex);
            }
        ]]>
    </mx:Script>

</mx:Text>

Он работает, получая доступ к методам объекта TextField внутри компонента Text, находя индекс символа под координатами мыши, а затем находя слово, которому принадлежит символ. Это быстрый пример, вам, вероятно, нужно сделать его более сложным для реального использования.

Другие советы

Вам необходимо использовать класс TextSnapshot. Вы можете получить его из своего текстового элемента управления из свойства textSnapshot. TextSnapshot имеет функцию hitTestTextNearPos (), которую можно использовать, чтобы определить, какой персонаж находится рядом с мышью пользователя.

...
var startIndex:Number;
...

private function textMouseMoveHandler(event:MouseEvent):void
{
    var snapshot:TextSnapshot = text.textSnapshot;
    var index = snapshot.hitTestTextNearPos(event.x, event.y);

    snapshot.setSelected(startIndex, index, true);
}

// I do not know how you want to begin the selection, so I put it here in the MouseEnter event.
private function textMouseEnterHandler(event:MouseEvent):void
{

    var snapshot:TextSnapshot = text.textSnapshot;
    startIndex = snapshot.hitTestTextNearPos(event.x, event.y);
}

Не уверен, как вы хотите справиться с началом выбора, но что-то подобное должно работать.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top