`
#天琪#
  • 浏览: 159351 次
  • 性别: Icon_minigender_2
  • 来自: 长沙
社区版块
存档分类
最新评论

Flex中对文本实现高亮显示

    博客分类:
  • FLEX
阅读更多
转自http://blog.minidx.com/2008/07/28/1178.html
去原处看吧,这篇里面没图,不好理解~~~

如何确定高亮块的位置及高宽是本文的重点。我们可以灵活运用TextField类的几个方法得到相关的数值:

1.getLineIndexOfChar(charIndex:int):int

Returns the zero-based index value of the line containing the character specified by the charIndex parameter.

2.getLineOffset(lineIndex:int):int

Returns the character index of the first character in the line that the lineIndex parameter specifies.

3.getLineLength(lineIndex:int):int

Returns the number of characters in a specific text line.

4.getLineIndexOfChar(charIndex:int):int

Returns the zero-based index value of the line containing the character specified by the charIndex parameter.

5.getCharBoundaries(charIndex:int):Rectangle

Returns a rectangle that is the bounding box of the character.

此外,我们再来看幅图片,了解一下Flash文本的结构:

“2-pixel gutter”这个要特别注意,若忘记加到位置计算公式中,高亮块会发生2像素的偏移.

现在来考虑下高亮块出现的几个位置(本例文本排列均限定为从左至右):

1.选定文本块在TextField显示区的所有行外



这种情况可以不处理.

2. 选定文本块在TextField显示区内





将选定文本块分划为多个”单行”处理:

首行高亮的区间为beginIndex至首行结束字符;

中间高亮的区间均为行首至行尾;

尾行高亮的区间为行首至endIndex.

3. 选定文本块一部分在显示区内,一部分在显示区外。分两种情况:

1) 起始索引小于显示区第一个字符的索引值,只需在下图中beginIndex至endIndex之间绘制高亮



2) 结束索引大于显示区最后一个字符的索引值,只需在下图中beginIndex至endIndex之间绘制高亮

 

总结如下:

1.获得有效的起始索引及结束索引;

2.如果为单行高亮块,进行单行绘制;

3.如果为多行高亮块,依次进行首行,中间行,尾行的绘制

基本方法确定后,我们在FLEX BUILDER 3中新建项目”HighlightTest”,



新建文件夹com->kingnare->regex

在regex文件夹中新建类HighlightBlock, superclass选择UIMovieClip.



根据前面的思路,我们写出HighlightBlock类:

HighlightBlock.as

简单描述一下HighlightBlock的流程:

通过getValidBeginCharIndex和getValidEndCharIndex方法得到高亮块在显示区的起始及结束索引,之后调用normalDraw绘制高亮块.

在normalDraw方法中,通过getDisLineHeightByLine得到输入索引值所在的行相对于文本注册点的距离,便于计算出高亮块的y坐标.

那么怎么使用这个类呢?

我们的接入参数类型是IUITextField,但TextArea等组件的内部文本均为protected,要通过继承来访问.我们新建文件com->components,在components文件夹中新建BlockTextArea类,superclass选择TextArea:



代码如下:

package com.components
{
import com.kingnare.regex.HighlightBlock;
import flash.display.DisplayObject;
import flash.geom.Point;
import mx.controls.TextArea;
 
public class BlockTextArea extends TextArea
{
private var blockArray:Array;
 
public function BlockTextArea()
{
super();
blockArray = [];
}
 
public function showBlock(beginIndex:int, endIndex:int):void
{
var movieTip:HighlightBlock= new HighlightBlock(this.textField);
 
movieTip.offsetPoint = new Point(0, 0);
movieTip.highLightDraw(beginIndex, endIndex);
movieTip.toolTip = “beginIndex: “+beginIndex+“\nendIndex: “+endIndex+“\nlength: “+(endIndex-beginIndex+1).toString()+“\ntext:\t”+this.textField.text.substring(beginIndex, endIndex+1);
clearBlock();
this.addChild(movieTip);
blockArray.push(movieTip);
}
 
public function clearBlock():void
{
var len:uint = blockArray.length;
 
for(var k:uint=0;k<len;k++)
{
var obj:DisplayObject = blockArray[k]
this.removeChild(obj);
obj = null;
}
blockArray = [];
}
}
}
切换到HighlightTest.mxml,设置主程序高宽为160×420,并添加一个BlockTextArea组件.

之后再加入其他控件:

<components:BlockTextArea id=”lightText” width=”400″ height=”100″ y=”10″ x=”10″/>
<mx:Button y=”118″ label=”Show Highlight” right=”10″/>
<mx:TextInput id=”beginIndexInput” x=”92″ y=”118″ width=”60″/>
<mx:TextInput id=”endIndexInput” x=”232″ y=”118″ width=”60″/>
<mx:Label x=”10″ y=”121″ text=”beginIndex:”/>
<mx:Label x=”160″ y=”121″ text=”endIndex:”/>
切换到Design panel:



接下来为主程序加入ActionScript代码.

首先是Application的applicationComplete事件:

<mx:Application xmlns:mx=”http://www.adobe.com/2006/mxml” layout=”absolute” xmlns:components=”com.components.*”
width=”420″ height=”160″ applicationComplete=”initApp();”>
然后在ActionScript块中编写initApp方法:

private function initApp():void
{
}
在这个方法里我们初始化lightText,beginIndexInput,endIndexInput的文本,并加入lightText的ScrollEvent事件的Listener:

import mx.events.ScrollEvent;
import mx.managers.ToolTipManager;
 
private function initApp():void
{
//ToolTip立即显示
ToolTipManager.showDelay = 0;
lightText.addEventListener(ScrollEvent.SCROLL, scrollEvent);
lightText.htmlText = “Documentation for classes includes syntax, “ +
“<b><font size=’18′>usage</font></b> information, and code samples for methods, “ +
“properties, “ +
“and event handlers and listeners for those APIs that belong to a specific class “ +
“in ActionScript (as opposed to global functions or properties). “ +
“The <font size=’24′>classes</font> are listed alphabetically. “ +
“If you are not sure to which class a certain method or property belongs, “ +
“you can look it up in the Index.”;
beginIndexInput.text = “43″;
endIndexInput.text = “300″;
}
再完成”show highlight”按钮的点击方法即高亮显示方法:

private function showBlock():void
{
lightText.showBlock(parseInt(beginIndexInput.text), parseInt(endIndexInput.text));
}
为了及时更新高亮块,我们还要加入一个计时器,当文本发生变化时调用showBlock重绘高亮块.最终主程序代码如下:

<?xml version=”1.0″ encoding=”utf-8″?>
<mx:Application xmlns:mx=”http://www.adobe.com/2006/mxml” layout=”absolute” xmlns:components=”com.components.*”
width=”420″ height=”160″ applicationComplete=”initApp();”>
<mx:Script>
 
<![CDATA[
 
import mx.events.ScrollEvent;
import mx.managers.ToolTipManager;
private var updateTimer:Timer;
 
private function initApp():void
{
ToolTipManager.showDelay = 0;
 
//timer
updateTimer = new Timer(5, 1);
updateTimer.addEventListener(TimerEvent.TIMER, validate, false, 0, true);
lightText.addEventListener(ScrollEvent.SCROLL, scrollEvent);
 
lightText.htmlText = "Documentation for classes includes syntax, " +
"<b><font size='18'>usage</font></b> information, and code samples for methods, " +
"properties, " +
"and event handlers and listeners for those APIs that belong to a specific class " +
"in ActionScript (as opposed to global functions or properties). " +
"The <font size='24'>classes</font> are listed alphabetically. " +
"If you are not sure to which class a certain method or property belongs, " +
"you can look it up in the Index.";
 
beginIndexInput.text = "43";
endIndexInput.text = "300";
}
 
private function showBlock():void
{
lightText.showBlock(parseInt(beginIndexInput.text), parseInt(endIndexInput.text));
}
 
//validate
private function validate(event:TimerEvent):void
{
showBlock();
}
 
//scrollEvent
private function scrollEvent(event:ScrollEvent):void
{
updateBlock();
}
 
//更新
private function updateBlock():void
{
updateTimer.reset();
updateTimer.start();
}
]]>
 
</mx:Script>
 
<components:BlockTextArea id=”lightText” width=”400″ height=”100″ y=”10″ x=”10″/>
<mx:Button y=”118″ label=”Show Highlight” click=”showBlock();” right=”10″/>
<mx:TextInput id=”beginIndexInput” x=”92″ y=”118″ width=”60″/>
<mx:TextInput id=”endIndexInput” x=”232″ y=”118″ width=”60″/>
<mx:Label x=”10″ y=”121″ text=”beginIndex:”/>
<mx:Label x=”160″ y=”121″ text=”endIndex:”/>
 
</mx:Application>
然后我们开始测试.点击”Debug”按钮:



点击”Show Highlight”按钮,可以看到绘制出的淡蓝色高亮块:



滚动条滚动时会调用updateBlock方法,在5ms后调用showBlock方法重绘高亮块:



(如果beginIndex小于0或endIndex大于等于文本长度,或者endIndex小于beginIndex均不会显示高亮块)

如果认为这种显示方式过于死板,你可以更改HighlightBlock类的drawBlock方法,或者继承HighlightBlock类重写drawBlock方法,做出诸如波浪线,下划线等效果.

如果将HighlightBlock类的_textField类型由IUITextField更换为TextField并做相关改动,HighlightBlock类也可用于ActionScript Project.

分享到:
评论
1 楼 wenqihui2008 2009-08-17  
不错,好东西,正需要。谢谢。只是以标记的文字不能选了。我想要就是一篇阅读理解中作标记那种,不知lz可否有提示一下。

相关推荐

    Flex中文本高亮显示

    标题“Flex中文本高亮显示”涉及到的是在Adobe Flex中实现文本内容的高亮显示技术。Flex是一款基于ActionScript的开源框架,用于构建富互联网应用程序(RIA)。在Flex中,文本高亮通常用于突出显示用户搜索的关键字...

    flex 实现全文检索中的高亮显示代码

    本篇文档将详细介绍如何在Flex中实现全文检索时的高亮显示效果。 首先,Flex是一个用于开发富互联网应用(Rich Internet Applications, RIA)的开源框架。它主要基于ECMAScript for XML (E4X) 的语法,结合...

    Flex实现在线显示Word文档,FlexPaper

    例如,搜索文本、高亮显示、添加注释等都是可能的。 4. **API集成**:FlexPaper 提供了一套丰富的API,允许开发者自定义界面和功能,如改变文档视图模式,调整页面布局,甚至实现社交媒体分享。 5. **安全性**:...

    Flex Tree快速定位树结点

    通过阅读和分析这些代码,你可以更深入地理解如何在Flex Tree中实现快速定位功能。 总结起来,"Flex Tree快速定位树结点"是一个提高用户交互体验的功能,它通过监听用户输入并搜索匹配的树节点,然后自动展开或选择...

    支持手动拖拽缩放flex组件的组件

    5. **交互反馈**:为了提供良好的用户体验,通常会在拖拽或缩放过程中显示一些视觉反馈,如高亮边框或动态调整的预览。 6. **响应式设计**:如果组件需要适应不同屏幕尺寸,那么它应该具有响应式设计,能够根据窗口...

    使用VIM开发Flex - 基础环境设置

    这些文件名正是压缩包中的两个文件,它们提供了对ActionScript和MXML文件类型的语法高亮、自动完成和格式化支持。 actionscript.vim是专门针对ActionScript编程语言的VIM插件。ActionScript是Flex的主要编程语言,...

    让Editplus成为Flex的IDE

    你可以利用它的多文档界面、代码折叠、查找替换等功能,结合AS3和MXML的语法高亮和代码辅助,实现高效、便捷的Flex编程。不过,值得注意的是,虽然EditPlus可以通过这样的方式增强对Flex的支持,但它与专业的Flex ...

    Flex中的各种滤镜

    在Flex这个强大的基于ActionScript 3.0的开源框架中,滤镜是为图形和文本添加视觉效果的重要工具。滤镜允许开发者创建出各种各样的视觉特效,如模糊、灰度、铅笔画等,极大地丰富了用户界面的视觉表现力。让我们深入...

    flexair网页截图工具

    在本例中,FlexComponentKit.mxp可能是FlexAir截图工具的核心组件,用于实现截图的交互逻辑和图像处理。 该工具可能包含以下特性: 1. **全屏截图**:FlexAir网页截图工具能够捕获整个浏览器窗口的内容,包括滚动...

    aa.rar_flex_formattedtext-1.0.0

    标签中的“flex formattedtext-1.0.0”再次强调了这个组件的核心特性,即它是Flex框架的一部分,专注于格式化的文本显示,并且其版本号是1.0.0,通常表示这是该组件的初始发布版本,可能包含基本功能但可能尚未包含...

    flex 内置验证器

    - 验证失败:如果验证失败,字段会被高亮显示,并显示错误信息。 在使用验证器时,可以通过修改 `trigger` 和 `triggerEvent` 属性来改变触发验证的事件。例如,可以设置 `trigger` 为一个按钮,`triggerEvent` 为 ...

    基于C语言的markdown解析器,提供语法高亮、脚注、pdf转换、目录、英语文本块翻译等功能.zip

    在这个项目中,我们关注的是一个功能丰富的Markdown解析器,它提供了多种增强功能,如语法高亮、脚注、PDF转换、目录生成以及英语文本块的翻译。 **语法高亮**:在Markdown文档中,代码区块经常被用到。语法高亮...

    flex各组件对应的样式属性

    16. **Highlight Alphas**:当需要高亮显示时,可以设置此属性来定义颜色的透明度变化。 #### 四、TabNavigator组件样式属性 `TabNavigator`组件用于创建具有标签导航功能的应用界面,其样式属性包括: 1. **Tab ...

    Flex常规控件和组件

    在 Flex 中,控件和组件是构建用户界面的基本元素,它们提供了多种功能和样式,以满足不同需求。下面将详细介绍这些常规的 Flex 控件和组件: 1. Button:Button 是最基本的动作触发器,用于响应用户的单击事件。它...

    学flex写的一个小例子,打字游戏。

    在打字游戏中,可以使用数据绑定将TextInput的文本与待打的单词同步,实时更新用户输入的情况。 6. **动画和效果**:Flex允许开发者添加动画和视觉效果来增强用户体验。例如,当用户输入正确,可以使用Transition...

    lex自动生成工具 flex+gcc

    5. **集成开发环境(IDE)**:虽然`flex`和`gcc`通常在命令行环境中使用,但在某些IDE如Code::Blocks、Eclipse或Qt Creator中,它们可以被集成,提供更友好的开发体验,例如自动构建流程和错误高亮。 6. **编译和...

    词法分析(实验报告)编译原理

    - **实验内容**:可能包括编写词法分析器,例如使用 Lex 或 Flex 工具,或者手动编写解析函数,实现对特定语言源代码的词法分析。 - **实验过程**:描述如何定义词法规则,如何处理各种类型的词法单元,以及如何测试...

Global site tag (gtag.js) - Google Analytics