gpt4 book ai didi

apache-flex - Flex TextArea - 如何突出显示光标下的行/行?

转载 作者:行者123 更新时间:2023-12-02 00:32:41 25 4
gpt4 key购买 nike

有一个 TextArea,我可以通过 textField.getLineIndexAtPoint(event.localX, event.localY) 找到行索引。如何设置所选行的背景颜色?某种行/行突出显示。谢谢!

最佳答案

好吧,这很可能不是您正在寻找的解决方案,因为我的解决方案针对的是标准闪存核心 TextField 类,而不是某些特定的 Flex 组件。但我想通过查看代码,您应该能够理解发生了什么并将其也传输到组件。

基本上我所做的是,我总是检查当前光标使用选择的位置,然后我得到响应行并在背景中绘制某种突出显示当前行的突出显示。请注意,我通过简单地基于单一字体来做到这一点相当容易,因此行高将始终相同。但是,您可以通过使用 TextLineMetrics 类并更准确地计算实际偏移量,使它适用于单个文本字段中的不同字体。因为这是更多的工作,而且突出显示可能只对单一字体环境有意义,所以我把它省略了。我下面的示例使用 Courier,但它应该自动处理任何大小的任何字体。

package
{
import flash.display.Shape;
import flash.display.Sprite;
import flash.events.Event;
import flash.text.TextField;
import flash.text.TextFieldType;
import flash.text.TextFormat;
import flash.text.TextLineMetrics;

public class HighlightedTextField extends Sprite
{
private var textField:TextField;
private var highlighter:Shape;
private var metrics:TextLineMetrics;
private var selectionBegin:int = -1;
private var selectionEnd:int = -1;
private var lineBegin:int = -1;
private var lineEnd: int = -1;

public function HighlightedTextField()
{
this.graphics.beginFill( 0xEEEEEE );
this.graphics.drawRect( 5, 5, 290, 290 );
this.graphics.endFill();

// construct text field
textField = new TextField();
textField.width = 280;
textField.height = 280;
textField.x = 10;
textField.y = 10;
textField.background = false;
textField.selectable = true;
textField.multiline = true;
textField.defaultTextFormat = new TextFormat( 'Courier', 12 );
textField.type = TextFieldType.INPUT;

// construct line highlighter
highlighter = new Shape();
highlighter.graphics.beginFill( 0xCCCCCC );
highlighter.graphics.drawRect( 0, 0, textField.width, 1 );
highlighter.x = textField.x;
highlighter.y = textField.y;

this.addChild( highlighter );
this.addChild( textField );
this.addEventListener( Event.ENTER_FRAME, setHighlighter );

// get line metrics and initialize highlight
metrics = textField.getLineMetrics( 0 );
setHighlighter( null );
}

private function setHighlighter ( event:Event ):void
{
var changed:Boolean = false;

// cache checks to make sure that the selection has changed
if ( selectionBegin != textField.selectionBeginIndex )
{
selectionBegin = textField.selectionBeginIndex;
lineBegin = textField.getLineIndexOfChar( selectionBegin );

// when the caret is at the end of the text, getLineIndexOfChar will return -1
lineBegin = lineBegin != -1 ? lineBegin : textField.numLines - 1;

changed = true;
}

// same as above
if ( selectionEnd != textField.selectionEndIndex )
{
selectionEnd = textField.selectionEndIndex;
lineEnd = textField.getLineIndexOfChar( selectionEnd );
lineEnd = lineEnd != -1 ? lineEnd : textField.numLines - 1;
changed = true;
}

// only move the highlight when something has changed
if ( changed )
{
highlighter.y = textField.y + metrics.height * lineBegin + 2;
highlighter.height = textField.y + metrics.height * ( lineEnd + 1 ) + 2 - highlighter.y;
}
}
}
}

您还可以在 Wonderfl 上查看此解决方案,以及一个工作演示。

关于apache-flex - Flex TextArea - 如何突出显示光标下的行/行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6075630/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com