如何在 Flex/Spark TextArea 或 TextFlow 中的特定位置添加图像
我有一个 Spark TextArea:
<s:TextArea id="editor">
<s:textFlow>
<s:TextFlow id="_tf" >
<s:p>Lorem ipsum etc.</s:p>
<s:p>
<s:img source="http://example.com/example.jpg" />
</s:p>
<s:p>Aliquam tincidunt tempor etc.</s:p>
</s:TextFlow>
</s:textFlow>
</s:TextArea>
和一个用于添加图像的按钮:
<s:Button id="imageBtn"
label="insert image"
width="89"
click="imageBtn_clickHandler(event);" />
以下脚本有效:
import flashx.textLayout.elements.*;
import mx.events.FlexEvent;
protected function imageBtn_clickHandler(evt:MouseEvent):void {
var img:InlineGraphicElement = new InlineGraphicElement();
img.source = "http://example.com/example.jpg";
var p:ParagraphElement = new ParagraphElement();
p.addChild(img);
_tf.addChild(p);
_tf.flowComposer.updateAllControllers();
editor.setFocus();
}
但仅附加到 TextFlow 的末尾。如何在 TextArea 中的活动插入符处插入 InlineGraphicElement?我的第一个想法是:
import flashx.textLayout.elements.*;
import mx.events.FlexEvent;
protected function imageBtn_clickHandler(evt:MouseEvent):void {
var img:InlineGraphicElement = new InlineGraphicElement();
img.source = "http://example.com/example.jpg";
var p:ParagraphElement;
//pseudocode
p = _tf.getCaret.AncestorThatIsParagraphElement;
// end pseudocode
p.addChild(img);
_tf.flowComposer.updateAllControllers();
editor.setFocus();
}
但这仍然只会附加在当前段落的末尾,假设我什至可以找到当前段落作为 .addChild() 的对象。那么如何将 InlineGraphicElement 插入 TextFlow 对象的子段落中的文本中间(甚至替换文本)。
感谢您的见解。
更新:越来越近了。
我可以在段落的开头或结尾添加内容。
protected function imageBtn_clickHandler(evt:MouseEvent):void {
var img:InlineGraphicElement = new InlineGraphicElement();
img.source = "http://example.com/example.jpg";
var insertInto:ParagraphElement = new ParagraphElement();
insertInto = editor.textFlow.getChildAt(
editor.textFlow.findChildIndexAtPosition(
editor.selectionAnchorPosition
)).getParagraph();
insertInto.addChildAt(0, img); // inserts at beginning of paragraph
insertInto.addChildAt(1, img); // inserts at end of paragraph
_tf.flowComposer.updateAllControllers();
editor.setFocus();
}
但插入中间仍然没有任何乐趣。另外,上面的代码不会替换突出显示的文本,但这不是这里真正关心的问题。
解决方案:
根据 Eugene 的链接,关键是 EditManager。
以下代码代表工作更新函数:
protected function imageBtn_clickHandler(evt:MouseEvent):void {
var em:EditManager = editor.textFlow.interactionManager as EditManager;
em.selectRange(editor.selectionAnchorPosition, editor.selectionActivePosition);
em.insertInlineGraphic("http://example.com/example.jpg","auto","auto");
_tf.flowComposer.updateAllControllers();
editor.setFocus();
}
I have a Spark TextArea:
<s:TextArea id="editor">
<s:textFlow>
<s:TextFlow id="_tf" >
<s:p>Lorem ipsum etc.</s:p>
<s:p>
<s:img source="http://example.com/example.jpg" />
</s:p>
<s:p>Aliquam tincidunt tempor etc.</s:p>
</s:TextFlow>
</s:textFlow>
</s:TextArea>
And a button to add an image:
<s:Button id="imageBtn"
label="insert image"
width="89"
click="imageBtn_clickHandler(event);" />
The following script works:
import flashx.textLayout.elements.*;
import mx.events.FlexEvent;
protected function imageBtn_clickHandler(evt:MouseEvent):void {
var img:InlineGraphicElement = new InlineGraphicElement();
img.source = "http://example.com/example.jpg";
var p:ParagraphElement = new ParagraphElement();
p.addChild(img);
_tf.addChild(p);
_tf.flowComposer.updateAllControllers();
editor.setFocus();
}
but only appends to the end of the TextFlow. How can I insert the InlineGraphicElement at the active caret in the TextArea? My first thought is something like:
import flashx.textLayout.elements.*;
import mx.events.FlexEvent;
protected function imageBtn_clickHandler(evt:MouseEvent):void {
var img:InlineGraphicElement = new InlineGraphicElement();
img.source = "http://example.com/example.jpg";
var p:ParagraphElement;
//pseudocode
p = _tf.getCaret.AncestorThatIsParagraphElement;
// end pseudocode
p.addChild(img);
_tf.flowComposer.updateAllControllers();
editor.setFocus();
}
But this still would only append at the end of the current paragraph, assuming I could even find the current paragraph as an object to .addChild() with. So how can I insert the InlineGraphicElement in the middle of text (or even replacing text) in a child paragraph of a TextFlow object.
Thanks for your insight.
UPDATE: Getting closer.
I'm able to add to the beginning or end of a paragraph.
protected function imageBtn_clickHandler(evt:MouseEvent):void {
var img:InlineGraphicElement = new InlineGraphicElement();
img.source = "http://example.com/example.jpg";
var insertInto:ParagraphElement = new ParagraphElement();
insertInto = editor.textFlow.getChildAt(
editor.textFlow.findChildIndexAtPosition(
editor.selectionAnchorPosition
)).getParagraph();
insertInto.addChildAt(0, img); // inserts at beginning of paragraph
insertInto.addChildAt(1, img); // inserts at end of paragraph
_tf.flowComposer.updateAllControllers();
editor.setFocus();
}
But still no joy in inserting into the middle. Also, the above code wouldn't replace highlighted text, but that's not the real concern here.
SOLUTION:
Based on Eugene's link the key to this is EditManager.
The following code represents the working updated function:
protected function imageBtn_clickHandler(evt:MouseEvent):void {
var em:EditManager = editor.textFlow.interactionManager as EditManager;
em.selectRange(editor.selectionAnchorPosition, editor.selectionActivePosition);
em.insertInlineGraphic("http://example.com/example.jpg","auto","auto");
_tf.flowComposer.updateAllControllers();
editor.setFocus();
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
使用此代码即可获得解决方案。
这是从系统文件夹获取的图像
Use this code you get solution.
here image getting from your system folder