Найдите слово, над которым наведена мышь, для компонента «Текст» (Flex / Actionscript)
-
03-07-2019 - |
Вопрос
Можно ли (если да, то как) узнать, над каким словом находится курсор / мышь, когда он перемещается над < 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);
}
Не уверен, как вы хотите справиться с началом выбора, но что-то подобное должно работать.