Flex 3在ActionScript 中构建自定义组件

可以使用ActionScript创建可重用的组件,并且在你的Flex程序中可以作为标签引用这个组件。在ActionScript中创建的组件能够包含图像元素,自定义业务逻辑,或者扩展已经存在的Flex组件。

ActionScript中,Flex组件实现了类层次结构。每一个组件,都是Action类的实例。

所有 Flex 可视组件都是源自于 UIComponent 类。要创建自己的组件,你可以创建一个继承 UIComponent 的类,或者继承 UIComponent 子类的类。

使用类作为自定义组件的超类,取决于你要实现的功能。例如,你或许需要一个自定义的按钮控件。你可以创建一个UIComponent类的子类,然后重写Flex Button 类的所有功能。更好更快创建自定义按钮组建的方法是创建一个Flex Button组件的子类,然后在自定义类中进行修改。

创建一个简单的ActionScript组件


当你要在ActionScript 中定义一个组件时,不要创建一个组件,而是修改一个已经存在的组件的行为。在下边的例子中,创建一个ComboBox类的子类,来创建一个自定义的ComboBox,命名为CountryComboBox——重新组装的国家列表。

注意:MXML中实例化你的组件,要使用类名作为标签名。


你可以放置自定义组件在项目的根目录或者子目录中。Adobe推荐后者。在这个例子中,自定义被放置在叫做components的子文件夹中,在ActionScript相当于components包。在主应用程序的MXML文件中,映射这个文件夹的命名空间为custom,并且使用完全合格的标签名<custom:CountryComboBox>来引用这个组件。

注意:MXML中实例化你的组件,要使用类名作为标签名。


你可以放置自定义组件在项目的根目录或者子目录中。Adobe推荐后者。在这个例子中,自定义被放置在叫做components的子文件夹中,在ActionScript相当于components包。在主应用程序的MXML文件中,映射这个文件夹的命名空间为custom,并且使用完全合格的标签名<custom:CountryComboBox>来引用这个组件。

例子

components/CountryComboBox.as

package components

{

    import mx.controls.ComboBox;

    public class CountryComboBox extends ComboBox

    {
        public function CountryComboBox()

        {

            dataProvider = [ "United States", "United Kingdom" ];

        }
    }

}


应用程序MXML文件


<?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
类继承了ComboBox类,所以能够在初始化自定义组件的MXML标签中或者在<mx:Script>标签中的ActionScript中,引用所有属性和方法。下边的例子指定了rowCount属性,并且为自定义组件的close事件指定了监听器。
例子

components/CountryComboBox.as
package components

{

    import mx.controls.ComboBox;

    public class CountryComboBox extends ComboBox

    {
        public function CountryComboBox ()

        {

            dataProvider = [ "United States", "United Kingdom" ];

        }
    }

}

应用程序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 above." width="136"/>      

    </mx:Panel>


</mx:Application>

为自定义组件应用样式


Style
属性定义了一个组件的感观,从字体大小到背景颜色。自定义的ActionScript组件继承了超类的所有样式,所以你也可以使用同样的方式来设置样式。


要在自定义组件中改变样式属性,可以在组件构造器中使用setStyle()方法。这样会应用相同的样式到所有的组件的实例中,但是组件的用户可以在MXML标记中覆盖setStyle()方法设置的样式。所有在组件类文件中为设置的样式均从超类继承。


在下边的例子中,创建了一个PaddedPanel自定义组件,它扩展了Panel组件,并且在组件四周一律使用10像素的边白。使用这个自定义组件,比每次使用Panel组件都要设置4个样式属性(paddingLeft, paddingRight, paddingTop, and paddingBottom)更简单,也就是说,结果是更少的编码,没有重复劳动。

例子

components/PaddedPanel.as


package components

{

    import mx.containers.Panel;
    public class PaddedPanel extends Panel

    {
        public function PaddedPanel()

        {

            // Call the constructor of the superclass.

            super();

         

            // Give the panel a uniform 10-pixel

            // padding on all four sides.

            setStyle("paddingLeft", 10);

            setStyle("paddingRight", 10);

            setStyle("paddingTop", 10);

            setStyle("paddingBottom", 10);

        }
    }

}

应用程序MXML文件


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


<mx:Application

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

    xmlns:custom="components.*"

    width="300" height="130"

    <custom:PaddedPanel title="Custom component styles">


        <mx:Text text="This is a padded panel component."/>

    </custom:PaddedPanel>  

</mx:Application>
 

创建一个高级的ActionScript组件


当使用ActionScript组件的普遍目的是创建可配置和可重用的组件。例如,创建一个ActionScript组件,它带有属性,分发时间,定义了新的样式,具有自定义的皮肤,或其他的个性化的设置。


当创建一个自定的ActionScript组件时,一个设计上要考虑的事情是可重用性。也就是说,你希望创建一个紧紧的绑定带你的应用程序的组件,还是能够在多个应用中可重用的组件?


编写与特定应用程序紧耦合的组件,经常是组件依赖于应用程序的结构,变量名或其他细节。如果你改变了应用程序,你可能需要修改紧耦合的组件来反映这种变化。一个紧耦合的组件,在没有重写的情况下很难应用到其他应用程序中。


设计一个松耦合的组件用于重用。松耦合的组件需要有清晰可辨的接口来指定如何向组件传递信息,如何将将结果传回应用程序。


典型的松耦合组件是使用属性来向组件传递信息。这些属性通过默认存取器(settergetter方法)来定义,指定参数的类型。在下边的例子中,CountryComboBox自定义组件定义了公共的userShortNames属性,此属性通过使用get userShortNames()set useShortNames()存取器方法暴露_ userShortNames私有属性。


私有属性_userShortNamesInspectable 元数据标签定义了一个特性,这个特性出现在Adobe? Flex? Builder?中的属性提示和标签内省器中。也可以使用这个元数据标签限制允许的属性值。


注意:所有公共属性出现在MXML的代码提示和属性检查器中。如果你有关于属性的额外的信息,这些信息能够帮助代码提示或属性检查器(像枚举型的值,或这个字符串实际是文件路径),那么也把额外的信息添加到[Inspectable]元数据中。


MXML
代码提示和属性检查器来于相同的数据,所以,如果在一个中显示出来那么在另一个中也应该一直显示出来。


在另一方面,ActionScript代码提示,不需要元数据也可以正常工作,所以你在ActionScript中依据所在的上下文一直都可以看待适当的代码提示。Flex Builder使用public/protected/private/static等等修饰符加当前所在范围计算出ActionScript代码提示。


定义组件向主应用程序返回信息的最佳实践是设计组件分发事件,事件中包含要返回的数据。那样,主函数能够定义时间监听器来处理时间,并且采取适当的行动。也可以使用数据绑定在事件中。在下边的例子中,使用Bindable元数据标签是userShortName编程一个被绑定的属性。隐含的userShortName属性的setter发送改变事件,这个过程使用了的Flex 框架的内部的机制,来使数据绑定正常工作。


连接:有些文章比这个引导性的快速指南更多的描述关于在ActionScript中创建高级组件的应用。全面描述这一主题,可以查看” Creating Advanced Visual Components in ActionScript”Creating and Extending Adobe Flex 3 Components.

components/CountryComboBox.as


package components

{

    import mx.controls.ComboBox;

    import flash.events.Event;

   

    public class CountryComboBox extends ComboBox

    {


        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 3.

        [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;

        }               

    }


}

应用程序 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>

创建复合 ActionScript 组件

 

例子
components/NumericDisplay.as

package components
{
    import mx.containers.VBox;
    import mx.containers.Tile;
    import mx.controls.TextInput;
    import mx.controls.Button;
    import mx.events.FlexEvent;
    import flash.events.Event;
    import flash.events.MouseEvent;

    public class NumericDisplay extends VBox
    {

        private var display:TextInput;
        private var buttonsTile:Tile;

        // Expose the _numButtons property to the
        // visual design view in Flex Builder 3.

        [Inspectable(defaultValue=10)]
        private var _numButtons:uint = 10;

        public function NumericDisplay()

        {
            addEventListener(FlexEvent.INITIALIZE, initializeHandler);
        }
       
        // numButtons is a public property that determines the
        // number of buttons that is displayed
        [Bindable(event="numButtonsChange")]

        public function get numButtons():uint
        {
            return _numButtons;
        }

        public function set numButtons(value:uint):void

        {
            _numButtons = value;
            dispatchEvent(new Event("numButtonsChange"));
        }

       
        // Gets called when the component has been initialized
        private function initializeHandler(event:FlexEvent):void
        {

            // Display the component
            paint();
        }

        // Add the label of the clicked button to the display
        private function buttonClickHandler(event:MouseEvent):void

        {
            display.text += (event.target as Button).label;
        }
       
        // Display the component

        private function paint():void
        {
            // Create the number display
            display = new TextInput();
            display.width=185;
            addChild(display);

            // Create a Tile container to

            // hold the buttons.
            buttonsTile = new Tile();
            addChild (buttonsTile);
           
            // Create the buttons and add them to
            // the Tile container.

            for (var i:uint = 0; i < _numButtons; i++)

            {
                var currentButton:Button = new Button();
                currentButton.label = i.toString();
                currentButton.addEventListener(MouseEvent.CLICK, buttonClickHandler);
                buttonsTile.addChild (currentButton);
            }

        }
    }
}
 

components/PaddedPanel.as

package components
{
    import mx.containers.Panel;

    public class PaddedPanel extends Panel
    {
        public function PaddedPanel()

        {
            // Call the constructor of the superclass.
            super();
           
            // Give the panel a uniform 10-pixel
            // padding on all four sides.
            setStyle ("paddingLeft", 10);
            setStyle ("paddingRight", 10);
            setStyle ("paddingTop", 10);
            setStyle ("paddingBottom", 10);
        }

    }
}
 

应用程序 MXML 文件

<?xml version="1.0" encoding="utf-8"?>
<mx:Application
    xmlns:mx="
http://www.adobe.com/2006/mxml"
    xmlns:custom="components.*"
    viewSourceURL="src/ASComponentComposite/index.html"
    width="300" height="225"

>
    <custom:PaddedPanel
        title="Composite component"
    >
        <custom:NumericDisplay numButtons="10"/>       
    </custom:PaddedPanel>

   
</mx:Application>
 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
书籍目录: 第1篇 Visual C#基础编程实例 实例1 C#经典程序--Hello World 实例2 C#的简单输入输出(I/O) 实例3 C#的复杂输入输出(I/O) 实例4 通信录管理与维护 实例5 文件与目录管理 实例6 用户界面上的“Hello,World!” 实例7 组件化“Welcome”程序 实例8 网络上的“Hello World” 实例9 Ref、Out与Params描述符的应用 实例10 C#自动内存管理的应用 实例11 一个有趣栈类的实现 实例12 垃圾收集器管理与应用 实例13 垃圾收集器算法控制与使用 实例14 调用栈记录异常点 实例15 使用C#异常的栈跟踪 实例16 运行期间检测变量类型 实例17 常用值类型的原型定义 实例18 打印杨辉三角形 实例19 比较学生信息 实例20 获取车辆信息 实例21 简单角色类游戏的制作 实例22 旅馆住宿登记情况表制作 实例23 长命名空间的应用 实例24 文件特征计数 实例25 文本框输入数据的验证 第2篇 Visual C#级编程实例 实例26 窗体背景颜色动态变化 实例27 C#属性及应用 实例28 C#属性Metadata的管理与应用 实例29 使用Context属性创建CallThreshold Service 实例30 使用应用程序域 实例31 创建C#组件与客户应用程序 实例32 用OpenFileDialog类浏览或打开文件 实例33 在C#程序获得Win32 API 实例34 从C#调用COM组件 实例35 在C#程序修改HTML文件标题 实例36 下载Web页面 实例37 创建多线程应用程序 实例38 多线程的多次加载 实例39 单个线程同步运行 实例40 多线程同步运行 实例41 线程Thread Relative Static跟踪与实现 实例42 线程池(ThreadPool)的应用 实例43 多线程互斥运行 实例44 多线程时钟应用程序 实例45 监视多线程 实例46 防止多线程应用程序死锁 实例47 文件同步操作与应用 实例48 在COM程序设计使用.NET组件 实例49 文件异步操作与多处理器系统 实例50 获取网络主机IP地址 实例51 C#对话信息框的应用 实例52 在C#快速调用Windows API 实例53 摄氏温度与华氏温度间相互转换(1) 实例54 摄氏温度与华氏温度间相互转换(2) 实例55 使用FileSystemWatcher组件监视Web服务器 实例56 由颜色名字产生对应颜色 实例57 使用索引指示器分析域名 实例58 C#版本的PingC 实例59 DNS客户程序 实例60 一个有趣的DOS实用程序 实例61 代表元基本应用 实例62 有趣的事件代表元 实例63 随机连续偶数发生事件处理 实例64 有趣的列表框窗体 实例65 数学函数应用 第3篇 Visual C#高级编程实例 实例66 文件夹的文件列表 实例67 读写文本文件 实例68 读写二进制文件 实例69 显示系统日期与时间(1) 实例70 显示差值的日期与时间(2) 实例71 时钟发生器应用 实例72 在.NET程序设计使用ATL 实例73 浏览Internet文件 实例74 在C#应用程序打开浏览器 实例75 显示Internet文件信息 实例76 Puzzle游戏 实例77 MDI窗体菜单设计(1) 实例78 MDI窗体菜单设计(2) 实例79 创建一个C#编辑器 实例80 网络端口扫描器 实例81 深入WinForms-地址簿应用(1) 实例82 深入WinForms--Image Viewer应用程序(2) 实例83 开饭时间提醒器(Meal Reminder) 实例84 服务器端C#实例 实例85 数字时钟设计技术 实例86 自动编译C#程序AutoCompiler 实例87 使用C#与ASP+编写File Uploder 实例88 访问注册表的硬件信息 实例89 设置“开始”菜单 实例90 在“新建”添加自己的文件类型 实例91 显示Exchange软件的客户名称 实例92 读取Windows注册表信息 实例93 自定义AboutBox组件 实例94 自定义控件及应用 实例95 Java与C#混合编程的应用 实例96 C#与C++混合编程的应用 实例97 C#与VB混合编程的应用 实例98 C#组件与C#客户程序编程的应用 实例99 C#与XML联合应用XMLHelper 实例100 在C#部署应用

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值