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

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

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

Ответы [ 2 ]

2 голосов
/ 02 мая 2009

Вот один из способов сделать это: вам нужно создать свой собственный компонент, который расширяет компонент mx: Text. Я использовал MyText в этом примере. Вот полный код для 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, поиска индекса символа под координатами мыши и затем поиска слова, которому принадлежит символ. Это быстрый пример, вам, вероятно, нужно сделать его более сложным для реального использования.

0 голосов
/ 01 мая 2009

Вам необходимо использовать класс 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);
}

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

...