是否有可能(如果可以)找出光标/鼠标在 < mx:Text > 组件上移动时所在的单词?因此,例如,当用户沿着一个句子(在文本组件内)移动鼠标时,每个单词都会随着它们的移动而突出显示(我知道您可以在按下鼠标按钮时突出显示 - 但我不希望这样做)。
感谢您提供任何信息。
是否有可能(如果可以)找出光标/鼠标在 < mx:Text > 组件上移动时所在的单词?因此,例如,当用户沿着一个句子(在文本组件内)移动鼠标时,每个单词都会随着它们的移动而突出显示(我知道您可以在按下鼠标按钮时突出显示 - 但我不希望这样做)。
感谢您提供任何信息。
这是一种方法:您需要创建自己的组件来扩展 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>
它通过访问 Text 组件内的 TextField 对象的方法,找到鼠标坐标下的字符索引,然后找到该字符所属的单词来工作。这是一个简单的示例,您可能需要对其进行更详细的说明以供实际使用。
您需要使用 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);
}
不知道你想如何处理开始选择,但类似的东西应该可以。