About

<#TEMPLATE_INCLUDE_NINEPAGE_ABOUTME#>
  • Jan

    30

    Feathers “pop-ups” 一些备注

    • 0 Comments
    • Flash Platform

    Feathers 包含了一个弹出窗口管理器(PopUpManager),管理 “pop-ups” (姑且称为它“弹出窗口”吧……,但在 pop-ups 的内容并不一定真的会是窗口……)内容。

    弹出窗口管理器允许开发者将弹出窗口内容置于所有其它 Starling 内容上面,并且提供了一些选项,比如模态化窗口或屏幕居中等功能。开发者还可以自定义弹出窗口的行为,比如弹出窗口内容的交互功能与显示列表中的位置等。

    假如焦点管理器(focus management)被启用时弹出窗口是一个模态化窗口,焦点管理器会为模态化窗口单独给出一个焦点管理器,以便防止模态化窗口下面的内容获得焦点。

    添加 pop-ups:

    使用 PopUpManager.addPopUp() 方法,可以将显示对象作为弹出窗口内容添加,必须先创建显示对象,如:

    var popUp:Image = new Image( texture );
    PopUpManager.addPopUp( popUp, true, true );

    第一个参数是弹出窗口内容,可以是任何 Starling 显示对象。

    第二个参数决定是否为模态化窗口(isModal)。

    第三个参数决定弹出窗口是否应该在舞台居中显示(isCentered)。如果舞台或弹出窗口尺寸发生变化,它会持续居中。

    第二和第三个参数是可选的。 如果省略,弹出窗口将是模态化窗口,并居中显示。 

    第四个参数也是可选的。允许开发者为模态化窗口传递自定义工厂方法用于设置“覆盖叠加”行为(指叠加模态化窗口下面的内容)。默认情况下,PopUpManager.overlayFactory 用于创建全局性的覆盖叠加行为,但也可以单独为某个弹出窗口设置覆盖叠加行为。

    移除 pop-ups:

    有两种方法可以移除弹出窗口。第一种方法是调用 PopUpManager.removePopUp() 方法。

    PopUpManager.removePopUp( popUp, true );

    第一个窗口是要移除的弹出窗口对象,如果传入的不是一个弹出窗口(pop-up)对象,就会产生运行时异常。第二个参数决定是否销毁对象(dispose)。

    也可以使用标准的 removeFromParent() 方法:

    popUp.removeFromParent( true );

    PopUpManager 会自动检测被移除的弹出窗口,如果是模态化窗口,“覆盖叠加”层也同时会被移除。

    居中 pop-ups:

    有两种方法可以让弹出窗口居中。

    第一种方法就是 PopUpManager.addPopUp() 方法的第三个参数设为 true。使用方法方法会让弹出窗口立即居中,并且会在舞台或窗口对象重置大小时持续居中。如果弹出窗口是一个 Feathers 组件,弹出窗口管理器(pop-up manager)就会在组件重置大小时让组件重新居中。如果普通的 Starling 显示对象则不行(普通的 Starling 显示对象在修改尺寸时并不会派发对应的事件)。

    第二种方法就是纯粹的调用 PopUpManager.centerPopUp() 方法,每调用一次就会执行居中算法一次。

    自定义 PopUpManager:

    通过定制 PopUpManager.overlayFactory,开发者可以更改模态化窗口的“覆盖叠加”行为与外观。默认情况下,全局的模态化窗口的叠加层是一个完全透明的 Quad 对象。可以自定义全局的“覆盖叠加层”:

    PopUpManager.overlayFactory = function():DisplayObject
    {
        var quad:Quad = new Quad(100100, 0x000000);
        quad.alpha = 0.75;
        return quad;
    };

    可以为单独的弹出窗口对象设置“覆盖叠加”行为:

    PopUpManager.addPopUp( popUp, true, true, function():DisplayObject
    {
        var quad:Quad = new Quad(100100, 0x000000);
        quad.alpha = 0.75;
        return quad;
    });

    开发者可以自定义 PopUpManager 的 root 属性,这是弹出窗口的根容器对象,默认情况下,PopUpManager 会直接将所有弹出窗口对象直接添加到 Starling 的 stage 对象。

    var popUpContainer:Sprite = new Sprite();
    this.stage.addChild( popUpContainer );
    PopUpManager.root = popUpContainer;

    如上代码,可以将所有弹出窗口对象都添加到 popUpContainer 容器中,这样可以确保弹出对象管理器的其它内容总是出现在所有羽毛内容的顶部(包括弹出对象)。

    Jan

    29

    在桌面开发时有一种常见的交互功能,就是通过键盘的 Tab 键切换获得焦点的对象,甚至通过键盘来执行按钮与滑块类的操作。Feathers 通过 FocusManager 类提供完全可选的焦点管理功能。一般来说,只应在桌面应用中启用焦点管理。 某些移动组件并未针对焦点管理进行优化。

    启用焦点管理:

    要使用焦点管理器功能,启动应用程序时只需要一行代码,然后用户就可以使用 Tab 键或 Shit + Tab 键在组件之间导航了。样例代码:

    FocusManager.setEnabledForStage( this.stage, true );

    如果开发的是一个桌面 AIR 程序拥有多个窗口,每个窗口有一个独立的舞台 Stage 对象,所以需要通过 setEnabledForStage() 方法为每个窗口单独设置一边。

    程序化的设置焦点:

    var focusManager:IFocusManager = FocusManager.getFocusManagerForStage( this.stage );
    focusManager.focus = button;

    这就好像是在 IFocusManager 实现类的对象上设置 focus 属性一样简单。

    要清除焦点,请将此属性设置为null:

    var focusManager:IFocusManager = FocusManager.getFocusManagerForStage( this.stage );
    focusManager.focus = null;

    自定义焦点顺序:

    默认情况下,在 Starling 世界里,通过键盘更改焦点对象时,是按显示列表中的顺序更改的。使用 getChildIndex() 方法和其它标准显示列表的 API,焦点管理器将以相对直观的顺序搜索显示列表,以找到可以接收焦点的下一个(或上一个)对象。

    如果焦点在转移的过程中与预期的效果不一样,可以通过 nextTabFocus 和 previousTabFocus 属性进行设置:

    var button1:Button = new Button();
    this.addChild( button1 );

    var button2:Button = new Button();
    this.addChild( button2 );

    button1.nextTabFocus = button2;
    button2.previousTabFocus = button1;

    焦点和弹出窗口:

    焦点管理器和弹出窗口管理器(pop-up manager)彼此知道如何沟通:

    a、如果弹出窗口是一个模态化窗口,会创建一个新的焦点管理器,这个新的焦点管理器会获得对键盘焦点的独占控制,所以模态化窗口口下面的内容都将无法接收焦点,直接到模态化窗口关闭。

    b、如果场景中同时有多个模态化窗口弹出,那么对应的会有更多的焦点管理器会被创建,并被添加到一个堆栈中,以确保最上面的模态化窗口会阻止所有下面内容的焦点。

    c、如果弹出窗口不是模态,则当前的焦点管理器将保持活动,并且一切都将能够接收焦点,包括弹出窗口和弹出窗口下面的所有内容。

    Jan

    29

    Feathers TextArea 一些备注

    • 0 Comments
    • Flash Platform

    TextArea 在备注文本编辑器资料时基本已经全部备注,其它的基本属性与功能(一些自动化相关的功能与皮肤样式等功能)也与 TextInput 组件类似。只是它是一个支持多行编辑功能的文本组件,而且文本框内的文本格式(字体样式)是需要一致的。

    TextArea 支持特殊的文本编辑器,需要实现 ITextEditorViewPort 接口。 默认的 TextArea 类的文本编辑器使用的是 TextFieldTextEditorViewPort 类(类似于 TextFieldTextEditor),它是通过 flash.text.TextField 来进行渲染的,因为传统的 TextField 是在原生舞台上,所以 skipUnchangedFrames 属性很可能会被禁用等。

    关于 skipUnchangedFrames 属性被禁用的资料请参看《skipUnchangedFrames 属性局限性》。

    另外就是它是带有滚动条的组件,滚动条的显示模式、交互功能、滚动策略与其它带有滚动条组件的备注资料是一致的,略。

    Jan

    29

    Feathers3 TextInput 一些备注

    • 0 Comments
    • Flash Platform

    TextInput 在备注文本编辑器资料时基本已经全部备注,只是 TextInput 除了文本编辑器部份外,还包含了一些自动化相关的功能与皮肤样式等功能。

    比如支持 prompt 功能:

    input.prompt = "Password";

    比如支持设置焦点与选择:

    input.setFocus();//程序化的获得焦点
    input.selectRange(0, input.text.length);//程序化的选择文本

    如果只是想简单的通过程序化的方式设置光标的位置,可以省略 selectRange()  第二参数:

    input.selectRange(0);

    TextInput 支持大量的类似 FLEX 框架中 TextInput 组件事件,如 Event.CHANGE、FeathersEventType.FOCUS_IN、FeathersEventType.FOCUS_OUT、FeathersEventType.ENTER 等事件。

    a、某些移动平台上 TextInput 组件可能并不会派发 FeathersEventType.ENTER 事件,具体取决于某些属性的值。这可能包括一些平台的默认值! 如果遇到此类问题,需要参考具体的“文本编辑器”的API文档,了解问题原因的限制和要求的完整详情。

    b、既便没有启用焦点管理器,TextInput 也会派发 FeathersEventType.FOCUS_IN、FeathersEventType.FOCUS_OUT 事件。

    maxChars 属性可以限制最大的输入字符数量;restrict 可以限制输入的字符。

    TextInput 可以设置多个状态的字体样式,如:fontStyles、disabledFontStyles、promptFontStyles、promptDisabledFontStyles 等。

    甚至可以自定义用户每个输入状态的字体样式,如:

    input.setFontStylesForState( TextInputState.ERROR,new TextFormat( "Helvetica"20, 0xcc0000 ) );

    当 TextInput  显示 errorString 属性时,会自动进入 TextInputState.ERROR 状态设置的文本样式。

    如果没有为某个状态设置字体样式,那么就会显示为默认的 fontStyles,比如一般我们没有设置 TextInputState.FOCUSED 状态的字体样式,所以显示的就是默认的 fontStyles。

    但是当 TextInput 获得焦点的时候,我们有可能会更改它的背景纹理。可以通过 setSkinForState() 方法实现,比如:

    var disabledSkin:ImageSkin = new ImageSkin( disabledTexture );
    input.scale9Grid = new Rectangle( 42210 );
    input.setSkinForState( TextInputState.DISABLED, disabledSkin );

    可以为 TextInput 添加一个图标(icon)。 可以为每个文本输入的状态定制图标(就像背景皮肤一样),比如,传递一个 starling.display.Image 对象:

    input.defaultIcon = new Image( iconTexture );

    如果只是简单的这样设置,这个默认的图标(defaultIcon)会在每个不同的状态都显示,如果想为单独的状态设置不同的图标,可以通过 setIconForState() 方法实现。

    TextInput 有一些常见的布局属性,如 paddingTop、paddingRight、paddingBottom、paddingLeft、padding 等。

    另一个比较有用的与布局有关的属性是 typicalText 。默认情况下,TextInput 的尺寸不会以输入的文本为尺寸进行计算,而是根据背景皮肤,填充和其他布局属性进行计算出来的。但有时候我们会需要根据文本的内容来显示对应尺寸的 TextInput ,比如一个 NumericStepper 组件,根据最大的可能的字符串来显示文本区域的尺寸可能是最合适的。

    Jan

    29

    TextFieldTextEditor 类使用 flash.text.TextField 渲染文本,基于软加速的。即可以使用设备字体也可以使用嵌入字体(TTF 或 OTF 格式)。将 TextField 对象的 type 属性设为 TextFieldType.INPUT。

    当 TextInput 获得焦点时,TextField 实例将显示在其他Starling内容上方的经典显示列表中,当失去焦点的时候,TextField 将被绘制到一个 BitmapData 对象并转换为 Starling 显示对象的纹理快照。这份快照可以添加到滚动容器,并且当没有焦点的时候可以被正确的裁切(失去焦点的时候 TextField 对象会自动 从原生舞台移除)。

    优缺点:

    传统原生的 TextField 对象可以使用设备字体,对于有许多字符的字体而言(如汉字),嵌入字体会使用大量的内存,使用设备字体可能是最佳选择。

    当TextInput 获得焦点时,此文本编辑器会在 Starling 上方的原生舞台层显示一个传统的 TextField 对象。失去焦点时 TextInput 对象可能本身显示在其它 Starling 对象的下面。一般来说,这种情况不会经常发生(除非开发者的布局设计本身有能是有问题的)。

    每段矢量文本都会被 draw 到 BitmapData 对象,再转换成 Starling 需要的纹理格式后提交到 GPU 使用。因此,当屏幕中有多个 TextFieldTextEditor 实例时,经常性的更改文本内容,可能会导致性能问题。

    flash.text.TextField 有时候性能会好于 Flash Text Engine,但这种性能差异可以忽略的。

    相对而言,TextFieldTextEditor 在移动设备上提供了比 StageTextTextEditor 稍微少一点的本地体验,高级功能类似复制 / 粘贴可能并不适合所有平台。TextFieldTextEditor 比较适合的情况是需要用到嵌入字体的时候。

    TextFieldTextEditor 对从右向左排版的语言文字和双向排版的语言文字支持功能比较有限,有时候可能无法正常显示。对这些语言推荐使用 StageText 或 Flash Text Engine。

    高级字体样式:

    该部份备注资料基本与《TextFieldTextRenderer 一些备注》相同,只是文本渲染器是通过 labelFactory 属性设置的,而文本编辑器是通过 textEditorFactory 属性设置的。

    一个文本渲染器的父组件有多个状态,如何更改它的高级字体样式: 

    该部份备注资料基本与《TextFieldTextRenderer 一些备注》相同。

    使用嵌入字体:

    该部份备注资料基本与《TextFieldTextRenderer 一些备注》相同。

    Jan

    28

    BitmapFontTextEditor 渲染文本时使用的是位图字体(bitmap fonts),这个文本编辑器与 Starling 是“深度整合”的,这意味着当文本编辑器获得焦点时,不会像 StageTextTextEditor 那样出现“叠加”效果。

    优缺点:

    由于 Adobe AIR 运行时功能限制,此文本编辑器不能在移动设备上使用。当文本编辑器获得焦点时, Adobe AIR 在 iOS 系上不会提供软键盘。此文本编辑器应该只用于桌面应用开发。

    位图字体的每个字符轮廓会变成纹理集中的子纹理,子纹理逐个的排列显示以组成单词和段落,如果文本具有特别风格化的外观(例如渐变和轮廓),位图字体能提供最佳性能,因为样式可以在设计时就完成,而不需要运行时动态生成消耗性能与内存。

    英语只有 26 个字母(除了一些需要用到的标点或其它特定的字符),一些语言可能需要成百上千,比如说中文……由于 GPU 纹理尺寸限制,除了使用其它文本渲染器外,就别无选择了。

    位图字体是可以被缩放的,但一般中人推荐缩小(因为放大模糊会比缩小模糊的更快)。可能会失去文本的细节,在较小号的字体时使用矢量字体有更好的清晰度,文字清晰了就更易于阅读。对相同字体但不同字号的情况,通常是制作多份字体的纹理集,但这会需要更多的内存。

    在同一个位图文本渲染器中,不支持多种字体样式(即一个字符只对应一个字符的轮廓图形)。

    高级字体样式:

    该部份备注资料基本与《BitmapFontTextRenderer 一些备注》相同,只是文本渲染器是通过 labelFactory 属性设置的,而文本编辑器是通过 textEditorFactory 属性设置的。

    一个文本渲染器的父组件有多个状态,如何更改它的高级字体样式:

    该部份备注资料基本与《BitmapFontTextRenderer 一些备注》相同。

    Jan

    27

    TextBlockTextEditor 使用 Flash Text Engine 显示文本,这是一个基于软加速的矢量字体渲染器,具有许多高级功能。可以使用设备字体或嵌入的字体(TTF 或 OTF 格式)。flash.text.engine.TextBlock 被 draw 到一个 BitmapData 对象,然后转换成 Starling 纹理图提交到 GPU 。这个文本编辑器与 Starling 是“深度整合”的,这意味着当文本编辑器聚焦时,不会像 StageTextTextEditor 那样出现“叠加”效果。

    (有一个“快照”的概念:这个快照大概意思是基于软加速的矢量文本,即使没有出现在原生舞台的显示列表上,也一样可以被 draw,然后 BitmapData 会直接转成 Starling 所需要的纹理格式上传至 GPU 更新文本编辑器的纹理,这是深度整合的原理,我猜的,你猜我猜的对不对?

    优缺点:

    Flash Text Engine 可以使用设备字体显示文本,对某些具有很多字符轮廓的语言(如中文),当嵌入字体需要太多内存时,设备字体就可能成了唯一的选择。Flash Text Engine 可以很好的支持从右向左排版的文字或双向文字,而 flash.text.TextField 就有可以无法正常显示。

    由于 Adobe AIR 运行时的功能限制,此文本编辑器不能在移动设备上使用。当文本对象获取焦点时,Adobe AIR 没有提供 API 可以调用 iOS 的软键盘功能,此文本编辑器仅适用于桌面应用开发。

    更改基于矢量的文本对象比使用位图字体要慢,因为矢量内容需要被 draw 到一个 BitmapData 对象,然后提交到 GPU 才能成为 Starling 显示的纹理图。如果用户输入较长的文本内容,在性能比较低的设备上转换成为纹理图、并上传纹理到 GPU 的时间可能会成为性能瓶颈。

    因为每段矢量文本需要被绘制到 BitmapData 对象,每个独立的渲染器在 GPU 上都需要一份单独的纹理图。如果在同一个屏幕上有多个 TextBlockTextEditor 实例,过的状态改变或 Starling 的渲染 / 绘制请求,可能会影响性能。

    Flash Text Engine 有时可能会比 flash.text.TextField 渲染的慢一些,一般来说,这种性能差异是可以忽略的,并且 FTE 引擎提供的更高级功能通常比牺牲一点点性能更划算。

    高级字体样式:

    该部份备注资料直接参考《TextBlockTextRenderer 一些备注》(是一样的)。

    一个文本渲染器的父组件有多个状态,如何更改它的高级字体样式:

    该部份备注资料直接参考《TextBlockTextRenderer 一些备注》(是一样的)。

    使用嵌入字体:

    该部份备注资料直接参考《TextBlockTextRenderer 一些备注》(是一样的)。

    Jan

    27

    StageTextTextEditor  通过 flash.text.StageText 对象渲染文本,StageText 已经为 iOS 与 Android 移动设备进行了优化,可以使用移动设备的本机文本输入功能。StageText 支持本机原生的复制 / 粘贴,自动更正,自动完成,文本选择和其他高级文本输入功能。

    当 TextInput 组件获得焦点时,StageText 实例就会出现在 Starling 层上面,当失去焦点的时候,文本框就会被 draw 到一个 BitmapData 对象,然后转换成为 Starling 需要的纹理格式,再提交到 GPU。TextInput 允许被添加到滚动容器中,因为最终显示的只是一个 Starling 显示对象,所以是可以被剪裁的。

    优缺点:

    StageTextTextEditor 使用设备字体,对某些具有很多字符轮廓的语言(如中文),当嵌入字体需要太多内存时,设备字体就可能成了唯一的选择。没有正式支持嵌入字体的功能,如果要在移动设备上使用嵌入字体的功能需使用 TextFieldTextEditor 。

    StageTextTextEditor 可以用于桌面应用开发,但在桌面上建义使用其它文本编辑器,因为其它的文本编辑器可以提供更多的功能和版式需求。StageText  在每个平台上的可用的功能和行为并不相同,具体的参考 API 手册

    当文本编辑器获得焦点时,StageText 实例就会出现,因为在 Starling 层上面,所以既便当失去焦点时,TextInput 组件是在其它组件的下面,只要获得焦点,这个 StageText 实例就一定会在所有 Starling 内容的上面。一般来说,这种情况不会经常发生(除非开发者的布局设计本身有能是有问题的)。

    每段矢量文本都会被 draw 到 BitmapData 对象,然后转换成为 Starling 需要的纹理格式,再提交到 GPU。因此,当屏幕中有多个 StageTextTextEditor 实例时,经常性的更改文本内容,可能会导致性能问题。

    高级字体样式:

    通常,是对一个文本渲染器的父组件使用 starling.text.TextFormat 类设置文本样式,例如设置一个 TextInput 的文本样式:

    input.fontStyles = new TextFormat( "Helvetica"20, 0xcc0000 );

    但是 starling.text.TextFormat 并不能设置文本编辑器的所有字体样式。如果想要进行高级的字体样式设置,可以参考下面的资料。以 TextInput 组件为例,设置 textEditorFactory 属性: 

    var input:TextInput = new TextInput();
    input.textEditorFactory = function():ITextEditor
    {
        var textEditor:StageTextTextEditor = new StageTextTextEditor();
        //为避免与主题文件中默认设置的样式冲突,先删除 styleProvider 提供的样式
        //textEditorFactory 会先执行,然后再执行主题文件中的代码,styleProvider 设为null 后,可以避免被覆盖
        textEditor.styleProvider = null;
        //设置高级字体样式
        return textEditor;
    };

    文本编辑器的高级字体样式设置可以是 fontFamily、fontSize、color 等属性,如: 

    textEditor.fontFamily = "Arial";
    textEditor.fontSize = 16;
    textEditor.color = 0xcccccc;

    StageTextTextEditor 还有其它更多的属性可以设置,具体的参考 API 手册

    Jan

    27

    Adobe Flash运行时提供了多种方式来编辑文本,并且有多种不同的方法在 GPU 上渲染文本,但并没有一最佳的方式,所以允许开发者自行根据需要选择最适合的“文本编辑器”(text editors)。在选择不同的文本编辑器时应考虑以下几个因素:

    1、应用是运行在移动设备上或桌面设备上。
    2、是否需要嵌入字体。
    3、使用是什么样的语言。

     这些因素会涉及到性能与内存的使用量,具体取决于选择的文本编辑器。

    Feathers 提供了 4 种不同的文本编辑器

    1、StageTextTextEditor :它使用的是 flash.text.StageText 对象,StageText  使用的是本机支持的原生文本输入,所以适用于所有平台,特别是在移动设备上。当一个文本输入框获得焦点时,StageText  就会显示在 Starling 层的上面。当文本框失去焦点的时候,文本框就会被 draw 到一个 BitmapData 对象,然后提交到 GPU 成为 Starling 显示的纹理图。

    2、TextFieldTextEditor :它使用的是 flash.text.TextField 对象,TextField 原生舞台对象,适用于所有平台。当一个文本输入框获得焦点时,TextField 就会显示在 Starling 层的上面。当文本框失去焦点的时候,文本框就会被 draw 到一个 BitmapData 对象,然后提交到 GPU 成为 Starling 显示的纹理图。

    3、TextBlockTextEditor :它使用的是 FTE 文本引擎(Flash Text Engine)是软渲染的,然后将结果 draw 到一个 BitmapData 对象,然后提交到 GPU 成为 Starling 显示的纹理图。此文本编辑器与移动应用不兼容(只能用于桌面 APP 开发)。

    4、BitmapFontTextEditor :它使用的是位图字体,每个字符对应的是一个独立的矩形子纹理图,通过 Image 对象显示的。此文本编辑器与移动应用不兼容(只能用于桌面 APP 开发)。

    每个文本编辑器都有不同的功能,所以一定要仔细区分,选择一个最佳的文本编辑器应用到开发中。

    默认的文本编辑器:

    通常情况下,应用程序中的大多数文本输入组件将使用相同类型的文本编辑器。为避免重复的在每个组件中单独设置文本编辑器,可以先设置一个全局的文本编辑器告诉所有组件默认情况下使用某种文本编辑器。只有当遇到某个组件不需要默认的文本编辑器时,才给它传递入特殊的文本编辑器,覆盖默认的类型。

    如果未经手动修改过,默认情况下会使用 StageTextTextEditor 对象,StageTextTextEditor 在移动开发时比较合适(它也能在桌面开发应用时良好的运行)。当使用主题文件时(theme),应该检查默认的文本编辑器。主题文件中通常会嵌入一种自定义字体,可能用于为了保持风格一体化或风格特殊化。

    当一个组件没有单独设置文本编辑器的时候,它会调用 FeathersControl.defaultTextEditorFactory() 方法。FeathersControl.defaultTextEditorFactory 是一个静态变量,可以根据需要任意的更改为不同的函数,默认它就是这样子:

    function():ITextEditor
    {
        return new StageTextTextEditor();
    }

     根据需要,也可以更改为 TextFieldTextEditor 作为默认的文本编辑器:

    FeathersControl.defaultTextEditorFactory = function():ITextEditor
    {
        return new TextFieldTextEditor();
    };

    在单个组件上使用不同的文本编辑器:

    可以给特定的组件指定特殊的文本编辑器,不使用(覆盖)默认的文本编辑器,比如一个 TextInput 对象:

    input.textEditorFactory = function():ITextEditor
    {
        return new TextFieldTextEditor();
    }

    甚至可以在返回文本编辑器之前,对文本编辑器设置字体相关的高级选项:

    input.textEditorFactory = function():ITextEditor
    {
        var textEditor:TextFieldTextEditor = new TextFieldTextEditor();
        textEditor.antiAliasType = AntiAliasType.NORMAL;
        textEditor.gridFitType = GridFitType.SUBPIXEL;
        return textEditor;
    }

    如果正在使用主题文件进行开发,需要小心:当对单个组件设置 textEditorFactory 属性时,可能被主题文件中的样式覆盖,因为主题文件中样式的使用是在单个组件设置 textEditorFactory 之后。可以在设置 textEditorFactory 属性时,对单个组件的自定义的文本编辑器的 styleProvider 属性设置为 null,这样可以避免被主题文件中的代码覆盖。

    自定义文本编辑器:

    如果想不同的方法渲染文本,需要实现 ITextEditor 接口类。除非自定义的文本编辑器能直接在 GPU 上进行渲染,否则就需要像 StageTextTextEditor 或 TextFieldTextEditor 类一样需要“快照”,draw 到一个 BitmapData 对象后,再上传到 GPU。(因为Feathers是开源的,可以随时参考 StageTextTextEditor 或 TextFieldTextEditor 类的代码)。

    请注意:除非你在自定义时能找到一种比使用 StageText 或 TextField 更好的方法,否则你就会无法访问移动设备的本机软键盘。如果没有了软键盘,自定义的文本编辑器可能只适用于桌面应用(或者提供一个自定义的备用软键盘用于移动应用)。

    多行文本编辑器:

    在移动设备上,StageTextTextEditor 可以提供用于编辑多行的文本功能,只要将 multiline 属性设为 true 即可,底层被包装的 StageText 对象就会自动提供滚动功能。

    在进行桌面应用开发时,TextArea 可能被使用,必要时它也可以被用于移动开发,但只推荐将它使用在桌面应用开发时。

    TextArea 支持特殊的文本编辑器,需要实现 ITextEditorViewPort 接口。目前 Feathers 内置也提供了一个 TextFieldTextEditorViewPort 类,它是默认的 TextArea 类的文本编辑器,类似于 TextFieldTextEditor,它是通过 flash.text.TextField 来进行渲染的。

    Jan

    26

    如果那么多的内置布局类都无法满足你的需求,Feathers 容器也支持自定义布局。

    Introduction to custom Feathers layouts

    ILayoutDisplayObject and ILayoutData

    Creating virtualized custom Feathers layouts

    我认为在 Adobe 彻底抛弃 AS3 之前,我都不会用到它了……