`
cloud21
  • 浏览: 396287 次
  • 性别: Icon_minigender_2
  • 来自: 北京
社区版块
存档分类
最新评论

实现一个自定义组件

    博客分类:
  • Flex
阅读更多
如果要创建一个自定义组件,你需要重写UIComponent类的某些方法,最少需要重写如下方法:构造函数, createChildren(), commitProperties(), measure(), layoutChrome(), updateDisplayList() 。
基础语句结构如下:
package myComponents
{
public class MyComponent extends UIComponent
{    .... }
}
注意包名与你的磁盘目录结构一致。接下来一一讲解每个方法的重写。
构造函数
示例如下:
public function 类名() {
super();
}
注意,AS3中构造函数不支持重载。
createChildren()
此方法的作用是在此自定义组件中创建子组件。
此方法不用你去调用,Flex在你将此自定义组件使用addChild方法加入到父组件时自动调用。示例如下:
// Declare two variables for the component children.
private var text_mc:TextArea;
private var mode_mc:Button;
override protected function createChildren():void {
    // Call the createChildren() method of the superclass.
    super.createChildren();
    // Test for the existence of the children before creating them.
    // This is optional, but do this so a subclass can create a different
    // child.
    if (!text_mc)     {
        text_mc = new TextArea();
        text_mc.explicitWidth = 80;
        text_mc.editable = false;
        text_mc.addEventListener("change", handleChangeEvent);
        // Add the child component to the custom component.
        addChild(text_mc);
    }
    // Test for the existence of the children before creating them.
    if (!mode_mc)     {    
        mode_mc = new Button();
        mode_mc.label = "Toggle Editing";
        mode_mc.addEventListener("click", handleClickEvent);
        // Add the child component to the custom component.
        addChild(mode_mc);
    }
}
上例使用createChildren()在此自定义组件中加入了一个Label和一个Button。
commitProperties()
此方法是在修改组件属性时使用。
此方法不用你去调用。当你调用invalidateProperties()(刷新属性)、addChild()(增加子组件)方法时,Flex会自动调用此方法。这样组件在下次显示时,就能以新的属性来显示。
此方法还有一个作用是为measure()方法提供最新的属性信息。
measure()
此方法的作用是设置组件的默认尺寸。
此方法不用你去调用。当你调用invalidateSize ()(刷新尺寸)、addChild()(增加子组件)方法时,Flex会自动调用此方法。这样组件在下次显示时,就能以默认尺寸来显示。
如果你显式的设置了组件的尺寸,如<mx:Button height="10" width="10"/>,Flex就不用调用此方法了。要注意,measure()方法只是设置组件的默认尺寸,在updateDisplayList()方法中,组件具备的实际尺寸(actual size)与默认尺寸可能不同。
Flex中的每个组件都是有默认尺寸的。如这样写:<mx:Button />,Flex就会自动给一个尺寸。如果你想重写默认尺寸,可以重新设置measuredHeight 、measuredWidth、measuredMinHeight、measuredMinWidth。如下例:
package myComponents
{
    // asAdvanced/myComponents/DeleteTextArea.as
    import mx.controls.Button;
    public class BlueButton extends Button {
        public function BlueButton() {
            super();
        }
       override protected function measure():void {
            super.measure();
            measuredWidth=100;
            measuredMinWidth=50;
            measuredHeight=50;
            measuredMinHeight=25;
        }
    }
}
然后在MXML中使用:
<?xml version="1.0"?> 
<!-- asAdvanced/ASAdvancedMainBlueButton.mxml -->
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" 
    xmlns:MyComp="myComponents.*" >
    <mx:VBox>
        <MyComp:BlueButton/>
        <mx:Button/>
    </mx:VBox>
</mx:Application>
此中的BlueButton就会以默认值100宽,50高来显示。
layoutChrome()
一些容器类(Container)或其子类采用此方法设置组件的border Area(边框区域)。
此方法不用你去调用。当你调用invalidateDisplayList ()(刷新显示)方法时,Flex会自动调用此方法。这样组件在下次显示时,就能以新的边框来显示。
典型的用法是你可以重写RectangularBorder类。
一个将组件的边框区域(border Area)和内容区域(content area)分开处理的原因是当Container.autoLayout=false时。
总括的来讲,layoutChrome()是用来处理边框区域的刷新显示,而updateDisplayList()用来处理内容区域的刷新显示。
updateDisplayList()
此方法不用你去调用。当你调用invalidateDisplayList ()(刷新显示)、addChild()(增加子组件)方法时,Flex会自动调用此方法。这样组件在下次显示时,就能以新的样子来显示。其实类似VC++中的PAINT消息处理。
此方法的主要作用为:
A.更改组件的尺寸和位置。要改变尺寸,在此方法中使用setActualSize()方法,而不是使用width和height属性来完成。要改变位置,在此方法中使用move()方法,而不是使用x和y属性来完成。
B.绘制可视元素,如皮肤、样式、边框。你可以使用Flash Drawing API来完成。
函数的原型为:
protected function updateDisplayList(unscaledWidth:Number,
    unscaledHeight:Number):void
两个参数分别为此自定义组件的宽度和高度。当然如果设置父容器设置scaleY=2,你设置unscaledHeight=100,那么最终呈现的是200高度的组件。
第一个功能示例:
package myComponents
{ 
    // asAdvanced/myComponents/BottomUpVBox.as
    import mx.containers.VBox;
    import mx.core.EdgeMetrics;
    import mx.core.UIComponent;
    public class BottomUpVBox extends VBox
    {
        public function BottomUpVBox() {
            super();
        }
        override protected function updateDisplayList(unscaledWidth:Number,
            unscaledHeight:Number):void {
            super.updateDisplayList(unscaledWidth, unscaledHeight);
            // Get information about the container border area. 
            // The usable area of the container for its children is the 
            // container size, minus any border areas.
            var vm:EdgeMetrics = viewMetricsAndPadding;
            // Get the setting for the vertical gap between children.
            var gap:Number = getStyle("verticalGap");
            // Determine the y coordinate of the bottom of the usable area 
            // of the VBox.
            var yOfComp:Number = unscaledHeight-vm.bottom;
            // Temp variable for a container child.
            var obj:UIComponent;
            for (var i:int = 0; i < numChildren; i++)
            {
                // Get the first container child.
                obj = UIComponent(getChildAt(i));
                // Determine the y coordinate of the child.
               yOfComp = yOfComp - obj.height;
                // Set the x and y coordinate of the child.
                // Note that you do not change the x coordinate.
                obj.move(obj.x, yOfComp);
                // Save the y coordinate of the child, 
                // plus the vertical gap between children. 
                // This is used to calculate the coordinate 
                // of the next child. 
                yOfComp = yOfComp - gap;
            }
         }
    }
}
第二个功能示例:
override protected function updateDisplayList(unscaledWidth:Number, unscaledHeight:Number):void {
    super.updateDisplayList(unscaledWidth, unscaledHeight);
    // Draw a simple border around the child components.
    graphics.lineStyle(1, 0x000000, 1.0);
    graphics.drawRect(0, 0, unscaledWidth, unscaledHeight);            
}
分享到:
评论

相关推荐

    jsf自定义组件的实现

    本文将引导你逐步了解如何在JSF中实现一个自定义组件,从基础开始,一步步构建一个简单的组件,最后达到能够开发复杂组件的能力。 ### 自定义组件的组成部分 一个完整的自定义JSF组件通常包含以下几个关键部分: ...

    C#的自定义组件和自定义控件

    在.NET Framework中,C#提供了一个强大的平台来创建自定义组件和控件,这使得开发者可以扩展.NET Framework的基础功能,实现特定的需求。本项目聚焦于C#中的自定义组件和控件开发,涵盖了一些常见的实用功能,如速选...

    小程序自定义组件例子

    弹窗组件通常用于显示临时的通知或对话框,是一个常见的自定义组件。它可能包括以下部分: - 结构:包含一个遮罩层和弹窗主体,主体中可能有标题、内容、按钮等元素。 - 样式:需要考虑弹窗的位置、大小、动画效果...

    使用微搭自定义组件实现搜索组件 .docx

    创建自定义组件库是指创建一个组件库,然后在其中创建自定义组件。登录低码控制台,找到组件库管理菜单,点击【新建组件库】按钮,输入组件库的名称和标识。 创建自定义组件 创建自定义组件是指在组件库中创建一个...

    android自定义组件demo

    这个"android自定义组件demo"实例提供了三种自定义组件的示例,是学习和理解Android自定义组件的一个宝贵资源。下面我们将深入探讨这三个自定义组件的关键知识点,并提供相关的实践指导。 1. **自定义View的基本...

    android自定义组件简单Demo

    本教程将通过一个简单的“TestOurselfWidget”实例来讲解如何实现自定义组件。自定义组件可以增强应用的用户体验,提供更个性化的界面设计。 首先,我们需要了解自定义组件的基本步骤: 1. **创建View类的子类**:...

    QML自定义组件显示在QT Designer库面板中的方法

    而从提供的部分内容来看,文章详细介绍了实现自定义组件集成的步骤。这些步骤包括: 步骤一:创建一个空的QtQuick工程,设置工程名称和路径,选择编译系统、QT版本、编译工具套件和版本控制。这是整个过程的基础,...

    Winform自定义组件库

    资源为Winform用户自定义组件库,是自己平时做项目...改库包含了常用的,按钮,圆角按钮,复选框,单选框,滚动条,带标题的Panel,Label,圆角窗口等等,基本项目用到的组件覆盖完了,能够实现一个软件的扁平化设计。

    Android:自定义组件绘制柱状统计图

    本文将深入探讨如何利用Android的Canvas API来实现一个自定义组件,用于绘制柱状统计图。柱状统计图是一种常见的数据可视化方式,常用于展示各类统计数据的比较。 首先,我们要理解Canvas的工作原理。Canvas是...

    微信小程序自定义组件实现图片单指拖动双指缩放效果

    本示例中,我们关注的是一个特定的自定义组件,它实现了图片的单指拖动以及双指缩放效果。这样的功能在很多应用场景中都非常实用,比如查看高清图片、地图导航等。 首先,我们需要理解微信小程序中的自定义组件是...

    各种Flex自定义组件

    在标题“各种Flex自定义组件”中,我们可以推断这是一个包含多种定制Flex组件的资源集合。这些组件可能包括时间选择器、数据网格(datagrid)、树形视图(tree)和下拉组合框(combox)。每个组件都有其特定的用途和...

    Qt美化界面、美化组件、自定义组件源码

    "Qt美化界面、美化组件、自定义组件源码"这个主题涵盖了提升Qt应用视觉效果和功能定制的核心知识点。Qt库提供了丰富的功能,允许开发者创建出优雅且高效的应用程序,而不仅仅是基本的用户界面。 首先,Qt美化界面...

    C#自定义组件

    - 压缩包中的"Lottery"文件可能是一个特定的彩票相关的自定义组件。这可能包含随机数字生成、结果显示、中奖提示等功能。 - 使用时,可能需要配置彩票类型、号码范围,然后调用组件的“开奖”方法,显示结果。 6....

    uniapp使用抖音微信自定义组件-uniapp如何用抖音的组件

    ### uni-app 使用抖音微信自定义组件详解 #### 一、引言 随着移动互联网的发展,跨平台应用开发框架越来越受到开发者的青睐。其中,uni-app作为一款使用Vue.js语法进行多端开发的前端框架,凭借其高效、易用的特点...

    Android自定义组件开发

    本文将深入探讨Android自定义组件的开发过程,旨在帮助开发者更好地理解和实践这一关键技能。 首先,理解Android组件的基本概念至关重要。Android组件是应用程序的基本构建块,主要包括Activity、Service、...

    JSF2.0实战 - 4、自定义组件

    例如,一个自定义组件的渲染器可能如下: ```java public class MyCustomComponentRenderer extends UIOutput implements Renderer { // override renderXXX methods to output HTML } ``` 渲染器的实现通常...

    Flex4自定义组件开发.pdf

    自定义组件是Flex4开发中的一个重要方面,它不仅可以让开发者根据项目需求创建独特的UI元素,还可以极大地提高应用的表现力和用户体验。通过深入理解Spark架构以及组件的生命周期,开发者可以更高效地开发高质量的...

    DELPHI中自定义组件的制作方法介绍

    在实际应用中,自定义组件允许开发者根据项目需求定制特定功能,从而实现更高效、更个性化的编程体验。 #### 二、自定义组件制作的基本步骤 自定义组件的制作流程包括以下几个关键步骤: 1. **编写组件单元(Unit...

    这是一个存放微信小程序自定义组件的仓库wxapp-components-examples.zip

    通过自定义组件,可以构建复杂的组件树,一个组件可以嵌套另一个组件,形成组件化的层次结构。这有助于保持代码的模块化,降低维护成本。 7. **样式隔离** 为了防止组件之间的样式冲突,微信小程序提供了样式隔离...

    android 自定义组件

    自定义组件允许开发者根据需求扩展Android系统原生组件的功能,或者创建全新的组件样式,从而实现个性化界面和交互效果。下面将详细介绍Android自定义组件的相关知识。 首先,我们要了解自定义组件的基本概念。在...

Global site tag (gtag.js) - Google Analytics