`

Flex 构建自定义组件 在 MXML 中构建组件

    博客分类:
  • Flex
阅读更多

在一个典型的应用程序中,并不会把所有代码都编写到一个文件中。这样会使多个开发者同事开发同一个项目和调试很困难,也会阻碍代码重用。取而代之,使用多个MXML和ActionScript文件来开发程序。这种架构会促进模块化设计、代码重用、多人开发统一程序。MXML组件是一个MXML文件,在其他文件内部通过MXML标记来引用它。MXML组件的最大用处就是扩展已经存在的Flex组件的功能。

例如,Flex支持ComboBox控件,你可以把它作为表单的一部分从客户那里收集地址信息。你可以使用ComboBox让用户从全世界的国家列表中选择地址中的国家部分。在一个应用程序中有多个地方用户需要输入地址。使用世界上所有国家信息来创建和初始化多个ComboBox是非常乏味的事情。

Flex遵循这样的原则:你创建一个自定义MXML组件,它包含一个ComboBox控件并且所有国家的名字信息。那么,无论在那里你增加一个国家选择器,你都可以使用你自定义的MXML组件。


本文分为如下几部分:

创建一个简单的自定义组件

引用一个自定义组件的属性和方法

创建一个复合的自定义组件

创建一个高级的自定义组件

创建一个简单的自定义组件


你可以在一个MXML文件中创建一个MXML组件,这个文件的名字就变成了这个自定义组件的标签名。比如:一个文件名字叫做CountryComboBox.mxml,使用标签<CountryComboBox>就可以定义这个组件。

一个MXML组件的根标签,是一个组件的标签,可以是Flex组件也可以是其他MXML组件。根标签指定http://www.adobe.com/2006/mxml作为命名空间。例如,下边的MXML组件扩展标准的Flex ComboBox控件。可以把自定义组件的文件放在项目的根目录中,也可以放在一个子目录中。Adobe推荐后一种方法作为最佳实践。在这个例子中自定义组件被放置到componects文件夹中。在主程序的MXML文件中,映射componects文件夹到custom命名空间,使用全标签名<custom:CountryComboBox>来应用这个组件。

 

提示:在现实世界中,你可能看到自定义组件被放置在公司域名倒叙的目录结构中。(比如, xmlns:custom="com.adobe.quickstarts.customcomponents.*")。这个习惯可以避免不同制造商在命名组件名称相同时导致的冲突。例如,两个组件库可能各自包含Map组件,如果一个com.vendorA.*一个在com.vendorB.*那么他们就不会冲突

 

例子

components/CountryComboBox.mxml

<?xml version="1.0" encoding="utf-8"?>

<mx:ComboBox xmlns:mx="http://www.adobe.com/2006/mxml">


    <mx:dataProvider>  

        <mx:String>United States</mx:String>

        <mx:String>United Kingdom</mx:String>

        <!-- Add all other countries. -->


    </mx:dataProvider>

</mx:ComboBox>

 

主文件

<?xml version="1.0" encoding="utf-8"?>


<mx:Application

    xmlns:mx="http://www.adobe.com/2006/mxml"

    xmlns:custom="components.*"

    width="220" height="115"

>


    <custom:CountryComboBox/>

</mx:Application>

 

 

 

 

引用一个自定义组件的属性和方法


CountryComboBox.mxml指定ComboBox作为其根标记,那么你可以引用所有ComboBox的属性和方法,在自定义组件的MXML标记中,或者在<mx:Script>标记中的ActionScript中也可以。例如,下边的例子为自定义组件指定了rowCount属性和一个关闭事件的监听器。

提示:在Flex中,MXML文件在编译成SWF文件之前,先编译成ActionScript类文件。当你为自定义的MXML组件指定根标记后,你实际上使你的自定义组件类扩展了根标记的组件类。这就是为什么自定义组件继承了根标记组件的方法和属性。

在下边的例子中,CountryComboBox MXML文件编译为一个class文件。Flex的命名习俗是组件名首字母大些,也对应类名。

例子

components/CountryComboBox.mxml

<?xml version="1.0" encoding="utf-8"?>

<mx:ComboBox xmlns:mx="http://www.adobe.com/2006/mxml">


    <mx:dataProvider>  

        <mx:String>United States</mx:String>

        <mx:String>United Kingdom</mx:String>

        <!-- Add all other countries. -->


    </mx:dataProvider>

</mx:ComboBox>

 

主应用程序的MXML文件

<?xml version="1.0" encoding="utf-8"?>


<mx:Application

    xmlns:mx="http://www.adobe.com/2006/mxml"

    xmlns:custom="components.*"

    width="270" height="170"

>


    <mx:Script>

        <![CDATA[


            import flash.events.Event;


            private function handleCloseEvent(eventObj:Event):void

            {


                status.text = "You selected: \r" + countries.selectedItem as String;

            }  

        ]]>

    </mx:Script>


    <mx:Panel

        title="Custom component inheritance"

        paddingTop="10" paddingBottom="10" paddingLeft="10" paddingRight="10"


    >

        <custom:CountryComboBox

            id="countries" rowCount="5"

            close="handleCloseEvent(event);"


        />

        <mx:Text id="status" text="Please select a country from the list." width="136"/>

    </mx:Panel>


</mx:Application>

 

 

 

创建一个复合的自定义组件


复合自定义组件中包含多个组件定义。为了创建复合自定义组件,应该指定一个容器,作为根组件,然后添加Flex组件作为其子组件。
 

下边例子中的AddressForm组件通过将Form容器作为根组件创建了一个地址表单。然后定义了几个Form容器的子组件。这些子组件中包含其他自定义组件—CountryComboBox。
 

例子
components/AddressForm.mxml

<?xml version="1.0" encoding="utf-8"?>
<mx:Form 
    xmlns:mx="http://www.adobe.com/2006/mxml"

    xmlns:custom="components.*"
>
   <mx:FormItem label="Name">
        <mx:TextInput/>
    </mx:FormItem>

    <mx:FormItem label="Street">
        <mx:TextInput/>
    </mx:FormItem>

    <mx:FormItem label="City"> 
        <mx:TextInput/>

    </mx:FormItem>

    <mx:FormItem label="State/County"> 
        <mx:TextInput/>
    </mx:FormItem>

    <mx:FormItem label="Country"> 
        <custom:CountryComboBox/>

    </mx:FormItem>
</mx:Form>

components/CountryComboBox.mxml


<?xml version="1.0" encoding="utf-8"?>

<mx:ComboBox xmlns:mx="http://www.adobe.com/2006/mxml">
    <mx:dataProvider>    
        <mx:String>United States</mx:String>
        <mx:String>United Kingdom</mx:String>

        <!-- Add all other countries... -->
    </mx:dataProvider>
</mx:ComboBox>

Main application MXML file
<?xml version="1.0" encoding="utf-8"?>

<mx:Application 
    xmlns:mx="http://www.adobe.com/2006/mxml"
    xmlns:custom="components.*"
    viewSourceURL="src/MxmlComponentComposite/index.html"
    width="400" height="290"

>
    <mx:Panel 
        title="Composite component"
        paddingTop="10" paddingBottom="10" paddingLeft="10" paddingRight="10"

    >
        <custom:AddressForm />
    </mx:Panel>
</mx:Application>

 

 

如果自定义组件文件中的根标记包含子组件时,当你在其他MXML文件中引用这个自定义组件标签时,这个标签不能包含子标签。如果你在MXML文件中定义了一个空容器,当你使用这个组件标签时,这个标签就可以包含子标签。

例如,下边的AddressForm的用法是不正确的,不能被编译。

<!-- Incorrect -->

<custom:AddressForm>
    <mx:FormItem label="Post code"> 
        <mx:TextInput/>
    </mx:FormItem>
</custom:AddressForm>

 

 

如果你必须扩展复合标签的功能,可以创建一个以符合组件作为根标记的自定义组件。


注意:这个关于子组件的限制只是在子组件是可视组件的时候起作用。可是组件都是UIComponent组件的子类。你永远都可以向不可视组件中插入标记,比如,ActionScript块,style,effect,fomatters,validator,和其他类型的不可视组件。不管你如何定义的自定义组件。


创建可重用的MXML组件


创建自定义组件的一个公共目标是创建可配置的、可重用的组件。例如,你想要创建一个自定义组件,带有属性、分发事件、定义新的样式属性、有自定义皮肤,或者其他自定义功能。创建自定义组件的一个预期回报是可重用。也就是说,你希望自定义组件紧紧的关联在你的程序中那?还是可以用在多个程序中?

为特定应用程序所编写的紧耦合的组件,经常使它依赖应用程序的结构,变量名,或其他细节。如果你改变应用程序,你可能需要修改紧耦合的组件来反应这种变化。紧耦合的组件如果不重写很难应用到其他应用程序中。

设计一个松耦合的组件来重用,它需要定义明确的接口来指定如何给组件传递信息,和组件如何向应用程序传回结构。

典型的,通过定义松耦合组件的属性,来向它传送信息。属性是通过定义固有的存取器(setter和getter方法)和指定参数的数据类型来实现的。在下边的例子中,CountryComboBox自定义组件定义了useShortName公共属性。这个属性通过get useShortName和set useShortName存取器方法使_useShortName变量暴露。

_useShortNames私有属性前的Inspectable元数据标签,定义了一个属性,这个属性出现在Adobe Flex Builder中的属性提示,和标签内省中。也可以使用这个元数据标签来限制对属性值的访问。

提示:所有公共属性会暴露在MXML的代码提示和属性检查器中。如果你有关于这个属性的额外的信息,能够帮助代码提示或属性检查器(比如枚举值,或只字符串是一个路径),那么也把这些而外信息添加到[Inspectable]元数据中。

MXML代码提示和属性检查器的数据来源是一样的。所以这两个的显示应该是一样的。

另一方面,ActionScript的代码提示是不需要元数据的,所以根据坐在的范围,你一直可以看到适当的代码提示。

Flex Builder 使用标识符(比如public private protected static)加上正确的上下文从而决定ActionScope的代码提示。

定义返回信息到主程序的组件的最佳实践是设计组件为发送包含返回值的事件。那样,主程序就能够定义事件处理器,来处理时间并进行适当的动作。也可以在数据绑定中使用事件。下边的例子中,使用Bindable元数据标签,使userShortName作为一个绑定的属性。useShortNames属性的seter方法发送改变事件,通过Flex Framework来实现数据绑定起作用。

例子
components/CountryComboBox.mxml

<?xml version="1.0" encoding="utf-8"?>
<mx:ComboBox xmlns:mx="http://www.adobe.com/2006/mxml">

    <mx:Script>
        <![CDATA[
            private var countryArrayShort:Array = ["US", "UK"];
            private var countryArrayLong:Array = ["United States", "United Kingdom"];
        
            // Determines display state. The inspectable metadata tag

            // is used by Flex Builder 2 
            [Inspectable(defaultValue=true)]
            private var _useShortNames:Boolean = true;
        
            // Implicit setter

            public function set useShortNames (state:Boolean):void 
            {

                // Call method to set the dataProvider based on the name length.
                _useShortNames = state;
        
                if (state) 
                {
                    this.dataProvider = countryArrayShort; 
                }

                else 
                {
                    this.dataProvider = countryArrayLong;
                }
                
                // Dispatch an event when the value changes
                // (used in data binding.)

                dispatchEvent(new Event("changeUseShortNames"));
            }
            
            // Allow other components to bind to this property
            [Bindable(event="changeUseShortNames")]

            public function get useShortNames():Boolean 
            {
                return _useShortNames;
            }                
         ]]>

    </mx:Script>
</mx:ComboBox>

 应用程序MXML文件

<?xml version="1.0" encoding="utf-8"?>

<mx:Application 
    xmlns:mx="http://www.adobe.com/2006/mxml"
    xmlns:custom="components.*"
    viewSourceURL="src/MxmlComponentAdvanced/index.html"
    width="260" height="200"

>
    <mx:Panel 
        title="Advanced custom components"
        paddingTop="10" paddingBottom="10" paddingLeft="10" paddingRight="10"

    >
        <!-- Set a custom property on a custom component -->
        <custom:CountryComboBox 
            id="countries"
            useShortNames="false"

        />
        
        <!-- 
            Use data binding to display the latest state
            of the property.
        -->
        <mx:Label text="useShortNames = {countries.useShortNames}"/>    
        
        <mx:ControlBar horizontalAlign="right">

            <mx:Button 
                label="Toggle Display"
                click="countries.useShortNames = !countries.useShortNames;"
            />

        </mx:ControlBar>
    </mx:Panel>
</mx:Application>

 

分享到:
评论

相关推荐

    flex自定义组件介绍

    标题中的“flex自定义组件介绍”指的是在Adobe Flex框架中创建和使用自定义组件的过程。Flex是一个基于ActionScript和MXML的开源框架,用于构建富互联网应用程序(RIA)。自定义组件允许开发者根据特定需求扩展Flex...

    flex4自定义组件皮肤

    在Flex4中,自定义组件皮肤是提升应用视觉效果和用户体验的重要手段。下面将详细介绍如何在Flex4中自定义组件皮肤。 1. **组件皮肤的基本概念** - 组件皮肤是Flex中改变组件外观的一种方式,通过定义不同的皮肤,...

    各种Flex自定义组件

    在Flex中,自定义组件是开发人员为了满足特定需求而创建的特殊用户界面元素。这些组件可以扩展标准的Flex组件库,或者从头开始构建,以提供独特的功能和视觉表现。 在标题“各种Flex自定义组件”中,我们可以推断这...

    flex 自定义组件

    在Flex中,自定义组件通常是通过继承已有的基类,如UIComponent或Button,然后添加自己的属性、方法和样式来实现的。这样做的好处在于,我们可以创建出符合设计规范、功能齐全且可重用的组件,提高代码复用率和开发...

    Flex自定义组件和事件

    在Flex中,自定义组件和事件的使用对于创建功能丰富的用户界面至关重要。下面我们将详细探讨这两个主题。 ### 一、Flex自定义组件 #### 1. 创建自定义组件的原因 在Flex应用中,有时标准组件库提供的组件无法满足...

    第五章 自定义组件开发 第一节 自定义Flex组件

    7. **使用组件**:最后,可以在MXML文件中像使用其他Flex组件一样使用自定义组件。 在实际开发中,我们还可能遇到一些高级话题,如组件的皮肤ning(Skinning)、状态管理(States)以及组件的性能优化。组件皮肤...

    Flex各自定义组件事件通讯例子

    在Flex开发中,自定义组件和事件通讯是构建复杂应用程序的关键技术。本示例通过一个简单的用户登录场景,深入解析了如何实现组件间的有效通信。下面将详细解释Flex自定义组件、事件处理以及它们在实际应用中的作用。...

    flex/flash自定义组件(搜索栏)

    自定义组件可以通过在Flex项目的MXML文件中引用`&lt;mx:SWFLoader&gt;`或`&lt;s:SWFObject&gt;`标签来加载`searchField.swf`。此外,也可以将AS3代码引入项目,以便在运行时动态实例化组件。 5. **源码分析**: 对于`document...

    Flex Mobile自定义实现的弹出对话框

    在Flex中,我们可以通过继承UIComponent或者Canvas等基础组件来创建自定义组件。在组件中,我们可以设计对话框的布局、样式和功能。 2. **设计界面**:对话框通常包含标题、内容区域和按钮。在Flex中,我们可以使用...

    ActionScript的自定义组件及自定义事件例子

    自定义组件和事件在Flex应用程序中发挥着关键作用,使开发者能够构建高度定制的用户界面和交互逻辑。 总的来说,掌握ActionScript的自定义组件和自定义事件是提升Flash和Flex开发技能的重要一步。通过实践和研究...

    flex 自定义控件、事件

    只需在标签库中引入自定义组件,然后在MXML布局中添加它。 6. **事件监听**:在Flex应用中,事件监听通常通过`addEventListener()`方法实现。你可以为自定义控件添加多个事件监听器,以处理不同类型的事件。事件...

    flex3自定义DownloadProgressBar

    在Flex中,自定义组件是通过继承已有的UIComponent或Flex提供的其他基类,然后添加所需的功能和视觉元素来实现的。对于DownloadProgressBar,我们可能需要继承 mx.controls.ProgressBar 类,它是Flex提供的一种用于...

    Flex4 自定义通用ImageButton

    在Flex4中,自定义组件是一项重要的技能,它允许开发者根据特定需求创建具有独特功能和外观的用户界面元素。本话题聚焦于自定义一个通用的`ImageButton`组件,该组件结合了图像和按钮的功能,提供了更丰富的交互体验...

    Flex3自定义的加载进度条

    在Flex3中,我们可以创建自定义组件来扩展或替换内置组件。首先,你需要了解MXML和ActionScript 3.0的基本语法,以及Component类和UIComponent类的概念。UIComponent是所有Flex组件的基类,你可以通过继承它来创建...

    (十八)Flex4_自定义ActionScript组件

    ActionScript组件是Flex4中自定义组件的主要方式,它提供了更高级别的抽象,使得组件开发更为高效和简洁。 描述中提到的"博文链接:https://schy-hqh.iteye.com/blog/1756582"可能是一个详细教程或者示例代码的来源...

    Flex轮弹组件

    6. 自定义组件:学习如何创建自定义组件,扩展Flex的内置组件以满足特定需求。 通过学习和实践,你可以掌握创建和使用Flex轮弹组件的技巧,并将其应用到自己的项目中,提升用户体验。同时,理解源码和利用相关工具...

    Flex手机项目自定义List的ItemRenderer

    在Flex手机项目开发中,创建自定义的List组件ItemRenderer是一项常见的需求,目的是为了提供更加丰富和个性化的显示效果。本文将深入探讨如何利用IconItemRenderer来实现这一目标,同时结合具体的实例,介绍两种不同...

    flex自定义文本编辑器

    在Flex中,实现自定义组件通常涉及创建一个新的MXML组件类,继承自Flex的基础组件,如`Spark Component`或`MX Component`。在这个案例中,这个组件可能扩展了`mx.controls.ColorPicker`,并添加了透明度选择功能。...

    Flex开发自定义控件

    在Flex中,自定义控件是指根据特定需求构建的新控件,这些控件可以基于现有的Flex标准控件进行扩展,也可以完全从头开始创建。自定义控件的主要优势在于能够提供更符合特定业务场景的用户界面组件,同时还能保持代码...

Global site tag (gtag.js) - Google Analytics