`
zerozone
  • 浏览: 205775 次
  • 来自: 北京
社区版块
存档分类
最新评论

20分钟创建基于Flex的Text Editor

阅读更多
选择开源文本编辑器如TinyMCE、FCKeditor,当然是不错的选择,但定制自己的Text Editor也不困难。最近使用Flex开发Editor,研究了一下Flex自带的RichTextEditor,发现其工作原理非常简单。为了研究其工作原理及不足,我使用两个核心类自定义了一个Editor,效果图见附件。欢迎拍砖。


目标:用Flex定制自己的Text Editor
功能:字体,大小,粗体,斜体,下划线,列表(Bullet),对齐方式(Alignment),字体颜色。
开发环境:Flex Builder 3

简介

    熟悉《设计模式》一书的开发人员都知道,此书从文档编辑器(document editor)展开讨论,引出数十种设计模式。本文对此不作讨论,我们所关注的是如何实现文档编辑器本身。更深入更复杂的例子,可以参考Jexi(参考价值更大,但没有实现Table),TinyMCE。
    

相关内容

    核心类--TextField和TextFormat

    TextField和TextFormat是实现文本编辑器的核心部件。TextField包含了文本的输入、显示和格式化功能,还有光标、选中(selection)处理。TextField是DisplayObject,可以作为子元素添加到Container上。TextFormat是Util类,负责表示用户设置的格式(Style)。

    事件处理

    用户交互,少不了事件处理。TextEvent类专门用于处理和Text相关的事件,例如用户键盘输入或点击一个超链接(Link)。除了TextEvent,还需要处理一些自定义的事件,例如文本区域的内容、格式改变。
  
如何创建

1.新建Flex Application,工程命名为test
2.新建MXML Component,基类是Panel类
     
      声明Event
     
      <mx:Metadata>
	       [Event(name="change", type="flash.events.Event")]
	       [DefaultTriggerEvent("change")]
      </mx:Metadata>

    
      声明变量。
     
      private var previousTextFormat:TextFormat = null;


      重载createChildren()方法(初始化)
      
       ////////////////////////////////
       //overridden 
       ////////////////////////////////
       override protected function createChildren():void{
	         super.createChildren();
	         createTextField(-1);					
       }			
       

     
      创建TextField控件本身,添加事件处理器。
     
      private function createTextField(childIndex:int):void{
          if(textField)return;
	      
	  textField = IUITextField(createInFontContext(UITextField));
	  //textField.
	  textField.autoSize = TextFieldAutoSize.NONE;
	  textField.enabled = enabled;
	  textField.ignorePadding = true;
	  textField.multiline = true;
	  textField.selectable = true;
	  textField.styleName = this;
	  textField.tabEnabled = true;
	  textField.type = TextFieldType.INPUT;
	  textField.useRichTextClipboard = true;
	  textField.wordWrap = true;
	
	  textField.addEventListener(Event.CHANGE, textField_changeHandler);
	  textField.addEventListener(Event.SCROLL, textField_scrollHandler);
	  textField.addEventListener(TextEvent.TEXT_INPUT,
	                                       textField_textInputHandler);
	                                     
	            
	  if (childIndex == -1){
	       addChild(DisplayObject(textField));
	       //updateDisplayList();
	  }                
            
	}


        应用文本格式
       
public function setTextStyles(type:String, value:Object = null):void{
				var tf:TextFormat;

				var beginIndex:int = textField.selectionBeginIndex;
				var endIndex:int = textField.selectionEndIndex;
		
				if (beginIndex == endIndex)
				{
					tf = previousTextFormat;
				}
				else	
					tf = new TextFormat();
				
				if (type == "bold" || type == "italic" || type == "underline")
				{
					tf[type] = value;
				}
				else if (type == "align" || type == "bullet")
				{
					if (beginIndex == endIndex)
					{
						tf = new TextFormat();
					}
		
					// Apply the paragraph styles to the whole paragraph instead of just 
					// the selected text
					beginIndex = textField.getFirstCharInParagraph(beginIndex) - 1;
					beginIndex = Math.max(0, beginIndex);
					endIndex = textField.getFirstCharInParagraph(endIndex) +
						textField.getParagraphLength(endIndex) - 1;
					tf[type] = value;
					if(!previousTextFormat) 
						previousTextFormat = new TextFormat();
					previousTextFormat[type] = value;
					if (!endIndex)
						textField.defaultTextFormat = tf;
				}
				else if (type == "font")
				{
					tf[type] = fontFamilyCombo.text;
				}
				else if (type == "size")
				{
					var fontSize:uint = uint(fontSizeCombo.text);
					if (fontSize > 0)
						tf[type] = fontSize;
				}
				else if (type == "color")
				{
					tf[type] = uint(colorPicker.selectedColor);
				}
						
				if (beginIndex == endIndex)
				{
					previousTextFormat = tf;
				}
				else
				{
					textField.setTextFormat(tf,beginIndex,endIndex);
				}
		
				dispatchEvent(new Event("change"));
				
				var caretIndex:int = textField.caretIndex;
				var lineIndex:int =	textField.getLineIndexOfChar(caretIndex);
		
				textField.invalidateDisplayList();			
		
				callLater(textField.setFocus);
			}


        添加ControlBar,编辑工具条
       
			<mx:ControlBar width="100%" > 
				<mx:ToolBar id="toolbar" width="100%" horizontalGap="7">			
					<mx:ComboBox id="fontFamilyCombo" editable="true"
						creationComplete=""
						dataProvider = "{fontFamilyArray}"
						close="setTextStyles('font');"
						enter="setTextStyles('font');"/>		
					<mx:ComboBox id="fontSizeCombo" editable="true"
						paddingLeft="2" paddingRight="2"
						dataProvider = "{fontSizeArray}"
						close="setTextStyles('size');"
						enter="setTextStyles('size');"/>							 
					<mx:HBox id="toolBar2" horizontalGap="0">		
						<mx:Button id="boldButton" width="20" toggle="true"							
								   icon="@Embed('icon_style_bold.png')"
								   click="setTextStyles('bold', event.currentTarget.selected);" /> 						
						<mx:Button id="italicButton" width="20" toggle="true"
								   icon="@Embed('icon_style_italic.png')"
								   click="setTextStyles('italic', event.currentTarget.selected);" /> 						
						<mx:Button id="underlineButton" width="20" toggle="true"
								   icon="@Embed('icon_style_underline.png')"
								   click="setTextStyles('underline', event.currentTarget.selected);" />		
					</mx:HBox>				
					<mx:ColorPicker id="colorPicker" width="22" height="22"
								close="setTextStyles('color');"/>		
					<mx:VRule height="{alignButtons.height}"/>		
					<mx:ToggleButtonBar id="alignButtons" buttonWidth="20"
									itemClick="setTextStyles('align', ToggleButtonBar(event.currentTarget).dataProvider.getItemAt(ToggleButtonBar(event.currentTarget).selectedIndex).action); " >
						<mx:dataProvider>
							<mx:Array> 
								<mx:Object icon="@Embed('icon_align_left.png')" action="left"/>
								<mx:Object icon="@Embed('icon_align_center.png')" action="center"/>
								<mx:Object icon="@Embed('icon_align_right.png')" action="right"/>
								<mx:Object icon="@Embed('icon_align_justify.png')" action="justify"/>
							</mx:Array>
						</mx:dataProvider>
					</mx:ToggleButtonBar>
					<mx:Button id="bulletButton" width="20" toggle="true"
						   icon="@Embed('icon_bullet.png')"
						   click="setTextStyles('bullet', event.currentTarget.selected);" />					 				
				</mx:ToolBar>
			</mx:ControlBar> 


  3.在test.xml引用该组件

     
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" xmlns:NewEditor="*">
	<mx:Style>
		Panel {
           borderAlpha: 1;
           borderThicknessLeft: 0;
           borderThicknessTop: 0;
           borderThicknessBottom: 0;
           borderThicknessRight: 0;
           roundedBottomCorners: true;
           headerHeight: 23;
           highlightAlphas: 0, 0.12;
           headerColors: #4e84df, #0f6cc3;
           footerColors: #efaa15, #e6780c;
           titleStyleName: "mypanelTitle";
        }
        .mypanelTitle {
           color: #ffffff;
           fontSize: 12;
           fontWeight:bold;
        }
        ControlBar {
            paddingTop:2px;
            paddingBottom:2px;
            height:15px;
        }
	</mx:Style>
	<NewEditor:NewEditor title="Text Editor" height="50%" />		
</mx:Application>

     
       注意,我们为Panel和ControlBar添加了样式(Style)。

问题和不足

    上述自定义Editor基于RichTextEditor(基于TextArea),有兴趣的读者可以研究它们。本文探讨如何实现简易的文本Editor。真正的Editor,包含很多类型的图元编辑,例如文本、图像、表格。由于TextField和TextFormat仅限于文本功能,因此要实现图像和表格编辑,还有很多的工作要做,甚至要抛弃TextField和TextFormat,设计一套基于Glygh的图元渲染系统。限于篇幅,不再进一步讨论。



  • 大小: 597.7 KB
分享到:
评论

相关推荐

    ArcGIS Server开发指南基于Flex和.Net源码

    ArcGIS Server开发指南基于Flex和.Net数据随书光盘内容.分两个文件上传。

    基于Flex&amp;Bison;的网页可编程计算器

    《基于Flex&Bison的网页可编程计算器》 在IT领域,构建一个网页可编程计算器是一项常见的实践项目,它能够帮助开发者提升对Web开发和解析器技术的理解。本项目以“基于Flex&Bison的网页可编程计算器”为主题,通过...

    ArcGIS Server开发指南--基于Flex和.NET源码.part1

    ArcGIS Server开发指南--基于Flex和.NET源码每一部分

    ArcGIS Server开发指南--基于Flex和.NET源码.part2

    ArcGIS Server开发指南--基于Flex和.NET源码第二部分

    基于Flex的简易图书管理系统(完整版)

    Flex是一种用于创建富互联网应用程序(RIA)的框架,由Adobe公司开发,主要使用ActionScript编程语言和MXML标记语言。这个“基于Flex的简易图书管理系统(完整版)”是一个使用Flex技术构建的简单图书管理应用程序,它...

    flex textlayout 滚动条

    6. **与TextLayout的结合**:在Flex项目中,可以将TextLayout与Scroller组件结合,创建一个具有滚动条的富文本显示区域。通过调整Scroller的尺寸和TextLayout的文本容器,可以确保滚动条在需要时出现,并正确地随着...

    为移动端设计基于Flex的UI框架

    在移动端UI设计中,基于Flex的框架已经成为一种流行的选择,因为它们能够提供高度灵活和响应式的用户界面。本文将深入探讨如何为移动端设计一个基于Flex的UI框架,并着重讲解其核心概念、优势以及如何实现。 Flex,...

    在Android程序上创建基于AIR的Flex的详细向导

    在Android平台上创建基于Adobe AIR的Flex应用程序是一个将Flash Builder与移动设备功能相结合的过程。Adobe AIR允许开发者使用Flex框架创建跨平台的应用程序,包括在Android上运行的多屏幕应用。本篇指南将逐步介绍...

    基于flex的地图动态标绘系统

    《基于Flex的地图动态标绘系统详解》 GIS(Geographic Information System)地图系统在现代信息社会中扮演着重要角色,它结合了地理信息与计算机技术,使得数据的可视化和分析更为直观有效。本文将深入探讨一个基于...

    基于Flex的 OA管理系统

    Flex是一种用于创建富互联网应用程序(RIA)的技术,它基于ActionScript编程语言和Flash Player运行环境。在本项目“基于Flex的OA管理系统”中,开发者使用了Flex 3.0版本来构建一个高效、交互性强的办公自动化系统...

    ArcGIS Server开发指南——基于Flex和.NET随书光盘

    【ArcGIS Server开发指南——基于Flex和.NET随书光盘】是针对GIS(地理信息系统)开发者的一份宝贵资源,特别关注于使用ArcGIS Server构建Web应用程序。这份资源包含多个组件,旨在帮助开发者深入理解如何利用Flex和...

    Flex技术入门之如何创建flex的web工程

    Flex基于ActionScript和MXML,能够创建具有高度交互性和动态视觉效果的Web应用程序,媲美Flash制作的精美界面。自从Flex的源代码开源后,它在IT RIA(Rich Internet Application)开发领域受到了广泛关注。 **1. ...

    ArcGIS Server开发指南基于Flex和.Net

    ArcGIS Server开发指南基于Flex和.Net数据随书光盘内容.分两个文件上传。此为文件一

    完全基于FLEX的WEB3D引擎例子源码及教程.rar

    Adobe Flex是一种用于创建富互联网应用程序(RIA)的开源框架,它基于ActionScript语言,支持MXML和AS3语法,提供了一套强大的组件库,使得开发人员能够轻松地创建具有动态图形和交互性的网页内容。而将Flex应用于...

    flex_fck_editor 例子

    Flex_FCK_Editor是一款基于Adobe Flex技术构建的开源富文本编辑器,它以其强大的功能和良好的用户体验赢得了广大开发者青睐。本文将详细探讨Flex_FCK_Editor的整合应用实例,帮助读者深入理解其工作原理和实际应用。...

    Flex+Java登录实例完整框架 基于Flex框架

    它包含了Flex编译器,可以将MXML和ActionScript代码编译为SWF文件,这是运行在Adobe Flash Player或Adobe AIR上的二进制格式。 3. **Flex Builder**:是一个集成开发环境(IDE),可以帮助开发者更高效地编写Flex...

    基于Flex的Flash聊天室的实现

    《基于Flex的Flash聊天室实现详解》 在Web开发领域,构建实时互动的聊天室是一项常见的需求,而基于Adobe Flex的Flash技术曾是实现此类应用的主流选择之一。本文将深入探讨如何使用Flex来创建一个功能完备的Flash...

    基于Flex框架的应用实例

    “第23章 基于Flex框架的应用实例.ppt”可能包含了一系列关于如何使用Flex创建实际项目的演示和教程。可能涵盖了以下内容:Flex项目的基本结构、组件的使用方法、事件处理、数据服务集成(如AMF或SOAP)、动画和效果...

Global site tag (gtag.js) - Google Analytics