`
唐朝
  • 浏览: 260719 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

使用Text Layout Framework实现图文混排

    博客分类:
  • flex
阅读更多

1.Flex Builder3要更新到3.0.2 http://www.adobe.com/support/flex/downloads_updaters.html 

2.下载Text Layout Framework http://labs.adobe.com/downloads/textlayout.html API文档: http://livedocs.adobe.com/labs/textlayout/package-summary.html

3.更新到Flash Player10 http://www.adobe.com/support/flashplayer/downloads.html 关于flshplayer10的新特性和相关资料,请查看 http://www.5uflash.com/yejiezatan/ziyuanfenxiang/3278.html

4.设置flex项目的属性Flex Compiler的Require Flash Player version为:10.0.0

5.拷贝Text Layout Framework 的三个swc(textLayout_conversion.swc、textLayout_core.swc、textLayout_edit.swc)到项目的libs目录中

6.编写mxml文件:

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
				layout="absolute"
				creationComplete="init()">
	<mx:Script>
		<![CDATA[
			import mx.managers.PopUpManager;
			import flash.text.engine.FontPosture;
			import flashx.textLayout.formats.CharacterFormat;
			import flashx.textLayout.events.StatusChangeEvent;
			import flashx.textLayout.elements.InlineGraphicElement;
			import flashx.textLayout.container.DisplayObjectContainerController;
			import flashx.textLayout.conversion.TextFilter;
			import flashx.textLayout.elements.TextFlow;
			import flashx.textLayout.edit.*;

			private var textContainor:Sprite;
			private var textFlow:TextFlow;

			[Embed(source="air.png")]
			[Bindable]
			static public var imgClass:Class;

			private static const textInput:XML= <TextFlow xmlns="http://ns.adobe.com/textLayout/2008">
					<div>
						<p>
							<img source="air.png"/>
							<span>Adobe® Flex® 3 是用于构建和维护在所有主要浏览器、桌面和操作系统一致地部署的极具表现力的 Web 应用程序的高效率的开放源码框架。 可以使用免费的 Flex SDK 构建 Flex 应用程序, 开发人员可以使用 Adobe Flex Builder™ 3 软件来显著促进开发。 60 天内免费试用 Flex Builder 3</span>
							<img source="air.png"/>
							<br/>
						</p>
					</div>
				</TextFlow>;

			public function init():void
			{
				textContainor=new Sprite();
				canvas.rawChildren.addChild(textContainor);
				textFlow=TextFilter.importToFlow(textInput, TextFilter.TEXT_LAYOUT_FORMAT);
				textFlow.flowComposer.addController(new DisplayObjectContainerController(textContainor, canvas.width, canvas.height));
				textFlow.addEventListener(StatusChangeEvent.INLINE_GRAPHIC_STATUS_CHANGED, picLoaded);
				textFlow.interactionManager = new SelectionManager();
				textFlow.interactionManager=new EditManager(new UndoManager());
				textFlow.interactionManager.setSelection(0, 0);
				textFlow.flowComposer.updateAllContainers();
			}

			private function picLoaded(event:StatusChangeEvent):void
			{
				//var image:InlineGraphicElement=event.element as InlineGraphicElement;
				textFlow.flowComposer.updateAllContainers();
			}

			public function insertImg():void
			{
				var editManager:IEditManager = textFlow.interactionManager as IEditManager;
				editManager.insertInlineGraphic(txtImgURL.text,100,100);
			}
			
			public function format():void {
				var editManager:IEditManager = textFlow.interactionManager as IEditManager;
				var charFormat:CharacterFormat = new CharacterFormat();
				//textFlow.interactionManager.setSelection(0,textFlow.
				charFormat.fontSize = 48;
				charFormat.fontStyle = flash.text.engine.FontPosture.ITALIC;
				charFormat.fontWeight = flash.text.engine.FontWeight.BOLD;
				//PopUpManager.
				//editManager.applyCharacterFormat(charFormat);
				//textFlow.removeChild(textFlow.getChildAtIndex(0));
				textFlow.characterFormat = charFormat;
				textFlow.flowComposer.updateAllContainers();
			}
		]]>
	</mx:Script>
	<mx:Canvas x="10"
			   y="10"
			   width="406"
			   height="287"
			   backgroundColor="#FFFFFF"
			   id="canvas">
	</mx:Canvas>
	<mx:TextInput x="70"
				  y="305"
				  width="268"
				  id="txtImgURL"/>
	<mx:Label x="10"
			  y="307"
			  text="图片URL:"/>
	<mx:Button x="346"
			   y="305"
			   label="插入图片"
			   id="btnInsertImg"
			   click="insertImg()"/>
	<mx:Button x="10" y="333" label="粗体" click="format()"/>

</mx:Application>

改造该示例以实现聊天窗口效果(纯属测试,无法实际应用)

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
				layout="absolute"
				creationComplete="init()">
	<mx:Script>
		<![CDATA[
			import flash.utils.describeType;
			import flashx.textLayout.elements.FlowLeafElement;
			import flashx.textLayout.elements.SpanElement;
			import flashx.textLayout.elements.FlowElement;
			import flashx.textLayout.elements.ParagraphElement;
			import mx.controls.Alert;
			import flashx.textLayout.conversion.ConversionType;
			import mx.controls.Image;
			import mx.managers.PopUpManager;
			import flash.text.engine.FontPosture;
			import flashx.textLayout.formats.CharacterFormat;
			import flashx.textLayout.events.StatusChangeEvent;
			import flashx.textLayout.elements.InlineGraphicElement;
			import flashx.textLayout.container.DisplayObjectContainerController;
			import flashx.textLayout.conversion.TextFilter;
			import flashx.textLayout.elements.TextFlow;
			import flashx.textLayout.edit.*;

			private var textContainor:Sprite;
			private var textFlow:TextFlow;
			
			private var txtOutContainor:Sprite;
			private var txtOutFlow:TextFlow;
			
			[Embed(source="air.png")]
			[Bindable]
			static public var imgClass:Class;

			private static const textInput:XML= <TextFlow xmlns="http://ns.adobe.com/textLayout/2008">
					<div>
						<p>
							<img source="air.png"/>
							<span>Adobe® Flex® 3 是用于构建和维护在所有主要浏览器、桌面和操作系统一致地部署的极具表现力的 Web 应用程序的高效率的开放源码框架。 可以使用免费的 Flex SDK 构建 Flex 应用程序, 开发人员可以使用 Adobe Flex Builder™ 3 软件来显著促进开发。 60 天内免费试用 Flex Builder 3</span>
							<br/>
						</p>
					</div>
					<div>
						<p>
							<img source="air.png"/>
							<span>Adobe® Flex® 3 是用于构建和维护在所有主要浏览器、桌面和操作系统一致地部署的极具表现力的 Web 应用程序的高效率的开放源码框架。 可以使用免费的 Flex SDK 构建 Flex 应用程序, 开发人员可以使用 Adobe Flex Builder™ 3 软件来显著促进开发。 60 天内免费试用 Flex Builder 3</span>
							<br/>
						</p>
					</div>
				</TextFlow>;

			public function init():void
			{
				textContainor=new Sprite();
				canvas.rawChildren.addChild(textContainor);
				textFlow=new TextFlow();//TextFilter.importToFlow(textInput, TextFilter.TEXT_LAYOUT_FORMAT);
				textFlow.flowComposer.addController(new DisplayObjectContainerController(textContainor, canvas.width, canvas.height));
				textFlow.addEventListener(StatusChangeEvent.INLINE_GRAPHIC_STATUS_CHANGED, picLoaded);
				textFlow.interactionManager = new SelectionManager();
				textFlow.interactionManager=new EditManager(new UndoManager());
				textFlow.interactionManager.setSelection(0, 0);
				textFlow.flowComposer.updateAllContainers();
				
				txtOutContainor = new Sprite();
				cavOut.rawChildren.addChild(txtOutContainor);
				txtOutFlow = new TextFlow();
				txtOutFlow.flowComposer.addController(new DisplayObjectContainerController(txtOutContainor,cavOut.width,cavOut.height));
				txtOutFlow.addEventListener(StatusChangeEvent.INLINE_GRAPHIC_STATUS_CHANGED, imgLoaded);
				txtOutFlow.interactionManager = new SelectionManager();
				//txtOutFlow.interactionManager = new EditManager(new UndoManager());
				txtOutFlow.interactionManager.setSelection(0,0);
				txtOutFlow.flowComposer.updateAllContainers();
			}

			private function picLoaded(event:StatusChangeEvent):void
			{
				//var image:InlineGraphicElement=event.element as InlineGraphicElement;
				textFlow.flowComposer.updateAllContainers();
			}
			
			public function imgLoaded(event:StatusChangeEvent):void {
				txtOutFlow.flowComposer.updateAllContainers();
			}
			
			public function insertImg():void
			{
				var editManager:IEditManager = textFlow.interactionManager as IEditManager;
				editManager.insertInlineGraphic(txtImgURL.text,100,100);
			}
			
			public function format():void {
				var editManager:IEditManager = textFlow.interactionManager as IEditManager;
				var charFormat:CharacterFormat = new CharacterFormat();
				//textFlow.interactionManager.setSelection(0,textFlow.
				charFormat.fontSize = 48;
				charFormat.fontStyle = flash.text.engine.FontPosture.ITALIC;
				charFormat.fontWeight = flash.text.engine.FontWeight.BOLD;
				//PopUpManager.
				//editManager.applyCharacterFormat(charFormat);
				//textFlow.removeChild(textFlow.getChildAtIndex(0));
				textFlow.characterFormat = charFormat;
				textFlow.flowComposer.updateAllContainers();
			}
			
			public function showText():void {
				var xml:XML = TextFilter.export(textFlow,TextFilter.TEXT_LAYOUT_FORMAT,ConversionType.XML_TYPE) as XML;
				Alert.show(xml.toXMLString());
			}
			
			public function showOutText():void {
				var xml:XML = TextFilter.export(txtOutFlow,TextFilter.TEXT_LAYOUT_FORMAT,ConversionType.XML_TYPE) as XML;
				Alert.show(xml.toXMLString());
			}
			
			public function sendMsg():void {
				var leaf:FlowLeafElement = textFlow.getFirstLeaf();
				var p:ParagraphElement = new ParagraphElement();
				if(describeType(leaf).@name == "flashx.textLayout.elements::SpanElement") {
            		var spanElement1:SpanElement = new SpanElement();
            		spanElement1.text = (SpanElement(leaf)).text+"\n";
            		p.addChild(spanElement1);
            	} else if(describeType(leaf).@name == "flashx.textLayout.elements::InlineGraphicElement") {
            		var inlineGraphicElement1:InlineGraphicElement = new InlineGraphicElement();
            		inlineGraphicElement1.source = (InlineGraphicElement(leaf)).source;
            		p.addChild(inlineGraphicElement1);
            	}
            	txtOutFlow.addChild(p);
            	
	            while(leaf = leaf.getNextLeaf()) {
	            	p = new ParagraphElement();
	            	if(describeType(leaf).@name == "flashx.textLayout.elements::SpanElement") {
	            		var spanElement:SpanElement = new SpanElement();
	            		spanElement.text = (SpanElement(leaf)).text+"\n";
	            		p.addChild(spanElement);
	            	} else if(describeType(leaf).@name == "flashx.textLayout.elements::InlineGraphicElement") {
	            		var inlineGraphicElement:InlineGraphicElement = new InlineGraphicElement();
	            		inlineGraphicElement.source = (InlineGraphicElement(leaf)).source;
	            		p.addChild(inlineGraphicElement);
	            	}
                	Alert.show(describeType(leaf).@name);
				}
				txtOutFlow.addChild(p);
				txtOutFlow.flowComposer.updateAllContainers();
			}
		]]>
	</mx:Script>
	<mx:Canvas x="10"
			   y="10"
			   width="406"
			   height="287"
			   backgroundColor="#FFFFFF"
			   id="canvas">
	</mx:Canvas>
	<mx:TextInput x="70"
				  y="305"
				  width="268"
				  id="txtImgURL"/>
	<mx:Label x="10"
			  y="307"
			  text="图片URL:"/>
	<mx:Button x="346"
			   y="305"
			   label="插入图片"
			   id="btnInsertImg"
			   click="insertImg()"/>
	<mx:Button x="10" y="333" label="粗体" click="format()"/>
	<mx:Button x="66" y="333" label="得到文本" click="showText()"/>
	<mx:Canvas x="424" y="10" width="556" height="287" backgroundColor="#7EC0EA" id="cavOut">
	</mx:Canvas>
	<mx:Button x="645" y="305" label="得到文本" click="showOutText()"/>
	<mx:Button x="144" y="333" label="添加文本到右边" click="sendMsg()"/>

</mx:Application>

  

分享到:
评论
5 楼 huyan0501 2011-07-04  
楼主你好!请问你现在是否实现了图片的拖拽功能?能交流一下吗?huyan05170138@163.com
4 楼 lionmusicyj 2010-05-29  
楼主,我在你说的地址上下载了framework,但是并没有你所说的
textLayout_conversion.swc、textLayout_core.swc、textLayout_edit.swc
这三个文件,只有简单的textLayout.swc,这是怎么回事呢?
问题很急,望回复
3 楼 唐朝 2009-06-01  
徐晶鑫 写道

怎么解决呢

1~5步骤你做了吗?
2 楼 徐晶鑫 2009-05-28  
怎么解决呢
1 楼 徐晶鑫 2009-05-28  
1046: 找不到类型,或者它不是编译时常数: FontMetrics。
1046: 找不到类型,或者它不是编译时常数: TextElement。
。。。。。。。。。。。。。。报了许多错

相关推荐

    IOS实现图文混排

    在实际应用中,开发者可以使用该机制来实现各种图文混排的功能,例如实现聊天应用程序中的表情发送功能,或者实现社交媒体应用程序中的图文混排功能。 知识点: 1. IOS 中的图文混排机制 2. 使用 NSString 和 ...

    实现带网络图片的html图文混排.docx

    因此,我们需要使用特殊的方法来实现图文混排。 二、ImageGetter的作用 ImageGetter是一个接口,它提供了获取Drawable对象的方法。在本文中,我们将使用ImageGetter来加载网络图片。通过重写getDrawable方法,我们...

    unity实现图文混排功能.zip

    总之,"unity实现图文混排功能.zip"项目提供了一个实用的解决方案,使开发者能够在Unity的Text组件中实现图文混排,增强了游戏或应用的用户界面。通过理解这个项目的工作原理,你可以进一步定制自己的图文混排功能,...

    Android 原生实现图文混排编辑器

    在Android开发中,创建一个能够...以上就是使用Android原生控件实现图文混排编辑器的关键步骤和注意事项。通过不断迭代和优化,我们可以构建出一个强大且易用的编辑器,满足用户在网络图片和本地图片编辑上的各种需求。

    Flex3 中 实现 图文混排

    完美解决Flex3 中 实现 图文混排 。

    Android 图文混排 ,文字围绕图片

    2. SpannableString与ImageSpan:更复杂的图文混排可以通过SpannableString和ImageSpan类来实现。SpannableString允许在字符串中插入各种Span对象,ImageSpan是其中一种,用于将图片插入到字符串中,可以实现文字...

    Flex 4 中 实现 图文混排

    1. **使用VGroup和HGroup**:你可以将图片和文本分别放入`VGroup`或`HGroup`中,然后将这些组再放入另一个更大的`VGroup`或`HGroup`,以此实现复杂的图文混排。通过设置`gap`属性调整元素之间的间距,通过`width`和`...

    swift-利用coreText实现图文混排类似H5的新闻界面

    以上就是使用Swift和CoreText实现图文混排的基本步骤。需要注意的是,实际开发中可能还需要处理文本换行、对齐方式、行间距、段落间距等问题,以及在不同尺寸的设备上适配。通过不断调整和优化,可以创建出类似H5...

    as3实现的图文混排组件

    通过以上知识点的阐述,我们可以看到,使用AS3实现的图文混排组件是一个综合了图形渲染、事件处理、内存管理等多个方面技术的工程。这个组件不仅能满足基本的图文显示需求,还能通过丰富的API和自定义功能,满足各种...

    dl dd dt实现的图文混排效果

    以上就是使用`&lt;dl&gt;`, `&lt;dd&gt;`, 和 `&lt;dt&gt;` 实现图文混排的基本步骤和样式调整。根据实际需求,你可以进一步调整样式,如间距、字体大小、颜色等,以适应不同的设计风格。记得在实际应用中,要确保代码的语义化,同时...

    AS3图文混排,图文混排

    AS3编写的图文混排,AS3编写的图文混排,AS3编写的图文混排

    NSTextAttachment富文本控件实现图文混排

    本教程将聚焦于如何使用`NSTextAttachment`控件来实现图文混排,这在创建通知、文章展示、设置个性化标签等领域非常常见。 `NSTextAttachment`是Apple的Foundation框架中的一个类,它是用于在富文本中插入图像或...

    Android 通过 WebView 与js 简单交互实现图文混排与查看大图功能

    本文将深入探讨如何利用WebView和JavaScript进行简单交互,以实现图文混排和查看大图的功能。 1. **WebView基本使用** - WebView是Android提供的一种内嵌浏览器组件,可以加载HTML、CSS和JavaScript代码,展示网页...

    ios-textKit实现图文混排最简单的实现.zip

    这个“ios-textKit实现图文混排最简单的实现.zip”压缩包显然是一个示例项目,用于演示如何利用TextKit来实现图文混排的功能。接下来,我们将深入探讨TextKit以及如何在TextView中实现图文混排。 1. **TextKit框架...

    egret_基于TextFlow属性实现图文混排.rar

    在本文中,我们将深入探讨如何在Egret游戏引擎中利用TextFlow属性实现图文混排。Egret是一个流行的开源JavaScript框架,专为2D游戏开发设计,它提供了丰富的图形渲染和交互功能。然而,Egret的默认TextField组件(即...

    Android下从网络获取数据实现图文混排效果

    在XML布局文件中,可以使用`LinearLayout`、`RelativeLayout`或`ConstraintLayout`等容器来实现图文混排。对于文本和图片的混合显示,可以使用`TextView`配合`ImageView`,通过设置适当的布局属性(如`android:...

    android开发 自定义图文混排控件

    在Android平台上,通常使用`TextView`和`ImageView`来分别处理文字和图片,但它们并不能直接实现复杂的图文混排,因此需要自定义控件。 博客中提到的控件`DemoPicTextTouchView`应该是这个项目的主类,它扩展了...

    swift-MYCoreTextLabel轻量级图文混排实现图片文字混排

    这一框架是用Swift语言编写的,适用于需要快速实现图文混排的场景,如微博、微信、即时通讯(IM)聊天对话等。 MYCoreTextLabel的核心特性包括: 1. **图文混排**:该库允许开发者在文本中自由插入图片,使得内容...

    UGUI 图文混排demo

    这个"UGUI 图文混排demo"项目基于Unity 5.4.1版本,这意味着它使用的是较早的UGUI系统,但仍然适用于现代的Unity项目,因为UGUI的基本结构和功能自那时起并未有太大改变。此Demo旨在展示如何在Unity中有效地实现图文...

    安卓自定义图文混排

    "安卓自定义图文混排"是指开发者根据具体需求,自定义控件来实现这一功能,以达到更加灵活、个性化的布局效果。在本项目中,"QuoteTextView-master"可能是一个开源库或者示例代码,用于帮助开发者实现这种混排。 ...

Global site tag (gtag.js) - Google Analytics