如果要创建一个自定义组件,你需要重写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);
}
分享到:
相关推荐
总的来说,理解并熟练运用这些方法是开发Flex高级自定义组件的关键。通过重写这些方法,开发者可以精确控制组件的外观、行为、布局和样式,从而创建出功能强大且具有独特设计的组件,满足各种复杂的交互需求。在实际...
### Flex4自定义组件开发详解 #### 一、Flex4自定义组件概述 Flex4(也称为Spark)是Adobe Flex框架的一个重要版本,它引入了许多新的特性,包括改进的组件库、性能优化以及更好的可定制性。在Flex4中,自定义组件...
### 一、Flex自定义组件 #### 1. 创建自定义组件的原因 在Flex应用中,有时标准组件库提供的组件无法满足特定的设计或功能需求。此时,开发者需要创建自定义组件来扩展Flex的功能,以实现个性化设计或定制化行为。...
1. **解决业务需求**:当现有Flex组件的功能或样式不足以满足项目的特殊需求时,如自定义一个按钮组件以支持长文本自动换行的功能,就需要对其进行重写。 2. **模块化设计**:为了提高代码的复用性和维护性,开发者...
2. **重写或扩展属性和方法**:根据需求,你可能需要重写父类的一些属性和方法,比如绘图方法(如`draw()`)或事件处理函数(如`mouseClick()`),以便定制控件的行为和外观。 3. **样式和皮肤**:Flex支持皮肤和...
在Flex开发中,组件重写是一项关键技能,它允许开发者根据特定需求定制标准组件,以实现更高效、更具个性化的用户界面。本文将深入探讨Flex组件重写的原因、注意事项、重写过程以及组件的内部执行流程,并通过示例...
这是一个flex4的项目,可以下载下来单独运行,其中重写了组件createChildren、commitProperties、measure和updateDisplayList方法,基本描述了他们在组件生命周期中所起的作用,并且在项目中实现了属性的事件绑定,...
在Flex中,组件的逻辑通常由ActionScript类实现,这些类扩展了基类(如UIComponent),并重写其方法来实现自定义行为。 3. **搜索栏组件**: - **基本结构**:搜索栏组件通常包括一个TextInput用于输入关键词,一...
自定义组件和事件在Flex应用程序中发挥着关键作用,使开发者能够构建高度定制的用户界面和交互逻辑。 总的来说,掌握ActionScript的自定义组件和自定义事件是提升Flash和Flex开发技能的重要一步。通过实践和研究...
在提供的压缩包文件中,`Flex自定义罗盘全副显示范围.pdf`可能是关于这个话题的详细教程或技术文档,而`CompassSample`可能是一个示例代码或项目,展示如何实际实现上述步骤。通过阅读文档和研究示例代码,开发者...
Flex自定义控件是Adobe Flex框架中的一个重要特性,它允许开发者根据特定需求创建自己的用户界面元素,以扩展标准组件库的功能。在Flex中,我们可以通过继承现有的UIComponent类或者使用Spark或 Halo组件模型来实现...
ActionScript组件是Flex4中自定义组件的主要方式,它提供了更高级别的抽象,使得组件开发更为高效和简洁。 描述中提到的"博文链接:https://schy-hqh.iteye.com/blog/1756582"可能是一个详细教程或者示例代码的来源...
2. 在新类中,可以重写`createChildren()`方法,这是Flex生命周期的一部分,用于创建并添加子组件。 3. 在`createChildren()`中,可以使用`addChild()`或`addElement()`方法添加所需的组件,如Button或其他UI元素。 ...
自定义控件通常通过继承已有的UIComponent或者更具体的基类,如Button或Canvas,然后重写其draw()方法,或者添加额外的属性和方法来完成。自定义控件可以实现独特的布局、样式、行为,甚至可以包含其他组件,从而...
本文将探讨Flex组件重写的必要性、考虑因素、以及AS和MXML方式的选用规则,并提供AS方式重写组件的一般步骤。 一、为什么要重写组件 1. 扩展功能:当Flex已有的组件无法满足特定业务需求时,我们可以通过继承现有...
自定义渲染器是Flex组件定制的一部分,它可以让我们对UI元素的显示方式有更大的控制力。在这个场景中,我们创建了一个针对DataGrid的自定义Label渲染器,这个渲染器能够根据数据显示不同的颜色,以突出关键信息或者...
Flex应用可以在多种平台和浏览器上运行,因此在设计自定义组件时,要考虑到不同环境的兼容性,确保在各种设备上都能正常工作。 综上所述,“Flex重写搜索框”是一个结合了Flex基础知识、组件自定义和UI设计的实例。...
8. **代码示例**:在提供的文档“Flex自定义Feature的style风格.doc”中,应该包含具体的代码片段,展示如何创建和应用自定义Style。 通过以上知识点,开发者可以根据需求创建出各种独特且富有表现力的地图展示效果...
综上所述,Flex提供了多种方式来给图片或组件着色,包括使用颜色过滤器、自定义组件、样式表等。在`zhuose.mxml`文件中,你可以看到具体的应用实例,通过分析这个文件,可以更深入地理解这些方法的实现。在实际开发...
Flex组件的生命周期是Adobe Flex框架中一个至关重要的概念,它涉及到...该文档可能还会涵盖一些高级话题,如自定义组件的生命周期管理和性能优化技巧。对于深入学习Flex组件生命周期,这份资料将是一份宝贵的参考资料。