flash使用图文混排,textFlow是最方便,最直接的API。虽然,textFlow的功能比较强大,可是使用起来也会有麻烦。

开始时候很陌生,相关api也比较多。自己需要它,于是花时间去学习,去研究它。将遇到的一些问题以及会想法总结出来。

对于图文混排,有输入编辑类的,还有仅仅显示类的。在做聊天功能,当然,输入先排在第一步。这个时候会渐渐遇到以下问题。

1,如何停留光标的位置。
2,如何将内容(文字和图像)插入到当前光标的位置。
3,当输入内容很多的时候,如何做下拉处理。

面向对象的的其中一个特征就是封装。你管什么,你有什么功能。我就把你封装在一起。先简单了解下有关textflow比较重要的api:
Configuration:Configuration 类允许通过 textFlowInitialFormat 属性为文本流指定初始的段落和容器格式。它还可用于为链接、当前选择、滚动指定初始格式属性,以及为处理 Tab 和 Enter 键指定初始格式属性。
ContainerController:ContainerController 类定义了 TextFlow 对象与容器之间的关系。
EditManager:EditManager 类可管理对 TextFlow 进行的编辑更改。要启用文本流编辑功能,请将一个 EditManager 对象指定给 TextFlow 对象的 interactionManager 属性。
TextLayoutFormat:TextLayoutFormat 类包含所有文本布局属性。这些属性可在容器级别、段落级别和文本级别影响文本流的格式和样式。

回归到第一个问题。如何停留光标位置呢。看这个功能,设计到编辑的,就找EditManager。实际是textFlow的interactionManager对象。先selectRange,然后setFocus。

textFlow.interactionManager.selectRange(editManager.anchorPosition , editManager.activePosition);
textFlow.interactionManager.setFocus();

 

再看第二个问题。在真正解决这个问题之前,我们都会想到用addChild。也就是textFlow去addChild段落(ParagraphElement),然后用段落(ParagraphElement)去addChild 文本(spanElement)丶显示对象(InlineGraphicElement)等。然后你会遇到,我该把这些对象如何插入到光标停留的位置呢。这个时候你会发现很郁闷,插入不了。那么这个时候,如果你想到了EditManager,一句代码就解决了。

editManager.insertInlineGraphic(inputGifPlayer , width , width );
editManager.insertText("梧桐树,三更雨,不道离情正苦.一叶叶,一声声,空阶滴到明.");

 

再看最后一个问题。想做下拉条,如果对方提供相关的api也好做。当你用纯as来实现时,发现没法获得ContainerController的内容高度的API。找了下资料,发现其实是有这个api的,只是要到命名空间。

import flashx.textLayout.tlf_internal;
use namespace tlf_internal;
var textHeight:int = Math.ceil(containerController.contentHeight);

 

然后,使用:

 containerController.verticalScrollPosition = textHeight - containerController.compositionHeight;

 

就可以跑到输入的最后位置了。