如果要创建一个自定义组件,你需要重写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组件通常包含以下几个关键部分: ...
在.NET Framework中,C#提供了一个强大的平台来创建自定义组件和控件,这使得开发者可以扩展.NET Framework的基础功能,实现特定的需求。本项目聚焦于C#中的自定义组件和控件开发,涵盖了一些常见的实用功能,如速选...
弹窗组件通常用于显示临时的通知或对话框,是一个常见的自定义组件。它可能包括以下部分: - 结构:包含一个遮罩层和弹窗主体,主体中可能有标题、内容、按钮等元素。 - 样式:需要考虑弹窗的位置、大小、动画效果...
创建自定义组件库是指创建一个组件库,然后在其中创建自定义组件。登录低码控制台,找到组件库管理菜单,点击【新建组件库】按钮,输入组件库的名称和标识。 创建自定义组件 创建自定义组件是指在组件库中创建一个...
这个"android自定义组件demo"实例提供了三种自定义组件的示例,是学习和理解Android自定义组件的一个宝贵资源。下面我们将深入探讨这三个自定义组件的关键知识点,并提供相关的实践指导。 1. **自定义View的基本...
本教程将通过一个简单的“TestOurselfWidget”实例来讲解如何实现自定义组件。自定义组件可以增强应用的用户体验,提供更个性化的界面设计。 首先,我们需要了解自定义组件的基本步骤: 1. **创建View类的子类**:...
而从提供的部分内容来看,文章详细介绍了实现自定义组件集成的步骤。这些步骤包括: 步骤一:创建一个空的QtQuick工程,设置工程名称和路径,选择编译系统、QT版本、编译工具套件和版本控制。这是整个过程的基础,...
资源为Winform用户自定义组件库,是自己平时做项目...改库包含了常用的,按钮,圆角按钮,复选框,单选框,滚动条,带标题的Panel,Label,圆角窗口等等,基本项目用到的组件覆盖完了,能够实现一个软件的扁平化设计。
本文将深入探讨如何利用Android的Canvas API来实现一个自定义组件,用于绘制柱状统计图。柱状统计图是一种常见的数据可视化方式,常用于展示各类统计数据的比较。 首先,我们要理解Canvas的工作原理。Canvas是...
本示例中,我们关注的是一个特定的自定义组件,它实现了图片的单指拖动以及双指缩放效果。这样的功能在很多应用场景中都非常实用,比如查看高清图片、地图导航等。 首先,我们需要理解微信小程序中的自定义组件是...
在标题“各种Flex自定义组件”中,我们可以推断这是一个包含多种定制Flex组件的资源集合。这些组件可能包括时间选择器、数据网格(datagrid)、树形视图(tree)和下拉组合框(combox)。每个组件都有其特定的用途和...
"Qt美化界面、美化组件、自定义组件源码"这个主题涵盖了提升Qt应用视觉效果和功能定制的核心知识点。Qt库提供了丰富的功能,允许开发者创建出优雅且高效的应用程序,而不仅仅是基本的用户界面。 首先,Qt美化界面...
- 压缩包中的"Lottery"文件可能是一个特定的彩票相关的自定义组件。这可能包含随机数字生成、结果显示、中奖提示等功能。 - 使用时,可能需要配置彩票类型、号码范围,然后调用组件的“开奖”方法,显示结果。 6....
### uni-app 使用抖音微信自定义组件详解 #### 一、引言 随着移动互联网的发展,跨平台应用开发框架越来越受到开发者的青睐。其中,uni-app作为一款使用Vue.js语法进行多端开发的前端框架,凭借其高效、易用的特点...
本文将深入探讨Android自定义组件的开发过程,旨在帮助开发者更好地理解和实践这一关键技能。 首先,理解Android组件的基本概念至关重要。Android组件是应用程序的基本构建块,主要包括Activity、Service、...
例如,一个自定义组件的渲染器可能如下: ```java public class MyCustomComponentRenderer extends UIOutput implements Renderer { // override renderXXX methods to output HTML } ``` 渲染器的实现通常...
自定义组件是Flex4开发中的一个重要方面,它不仅可以让开发者根据项目需求创建独特的UI元素,还可以极大地提高应用的表现力和用户体验。通过深入理解Spark架构以及组件的生命周期,开发者可以更高效地开发高质量的...
在实际应用中,自定义组件允许开发者根据项目需求定制特定功能,从而实现更高效、更个性化的编程体验。 #### 二、自定义组件制作的基本步骤 自定义组件的制作流程包括以下几个关键步骤: 1. **编写组件单元(Unit...
通过自定义组件,可以构建复杂的组件树,一个组件可以嵌套另一个组件,形成组件化的层次结构。这有助于保持代码的模块化,降低维护成本。 7. **样式隔离** 为了防止组件之间的样式冲突,微信小程序提供了样式隔离...
自定义组件允许开发者根据需求扩展Android系统原生组件的功能,或者创建全新的组件样式,从而实现个性化界面和交互效果。下面将详细介绍Android自定义组件的相关知识。 首先,我们要了解自定义组件的基本概念。在...