flex 自定义组件的编写
使用flex也很久了,也改过别人写的flex自定义组件,但是就是没有系统的研究下flex组件的编写步骤,和要注意的东西,在这里我参照一本书中的例子,好好的理解下,也为了巩固下自己对flex的理解!
1,重写一个组件系统依次调用Constructor(构造方法)-->createChildren()-->commitProperties()==>measure()==>updateDisplayList() ;
a,Constructor构造方法,初始化属性,默认值 在这个方法中使用最好。
b,createChildren() 创建子对象,在组件中添加子对象。是使用addChild方法添加子对象
c,commitProperties 用在处理属性值和更新。(多个属性值更新后统一处理入口和单值多次修改后处理入口)
d , measure()设置组件的默认大小(以便Flex布局管理器能正确知道该组件的大小,给其分配适当空间)
e,updateDisplayList()用来重绘组件,子对象布局逻辑等
2,添加自定义组件实际上就是将一个基本的组件的组合起来,这样的情况下就必须要重写createChildren() 和 updateDisplayList()方法
当自定义组件要对属性的变化作出反应的时候必须要重写commitProperties()方法(触发调用这个方法的是invalidateProperties)
当自定义的组件和基类组件大小不一致的情况下就要调用measure 保证正确的大小显示。(调用invalidateSize方法)
当组件需要调整子对象全局显示逻辑,重写updateDisplayList,调用invalidateDisplayList
commitProperties measure 和 updateDisplayList 都有自己的用处
在下面写个例子 一个button 和 TextArea 组合的自定义组件
package cn.tsoft
{
import flash.events.Event;
import flash.text.TextLineMetrics;
import mx.controls.Button;
import mx.controls.TextArea;
import mx.core.UIComponent;
/**
* 当子组件textArea中文件变化时,ModelText派发一个change事件
* 当ModelText的text属性被设置时,派发一个textChange事件
* 当改变Modeltext的textplacement属性后,会派发一个placementChanged事件
* **/
[Event(name="change",type="flash.events.Event")]
[Event(name="textChanged",type="flash.events.Event")]
[Event(name="placementChanged",type="flash.events.Event")]
public class ModelText extends UIComponent
{
public function ModelText()
{
super();
}
private var text_mc:TextArea;
private var mode_mc:Button;
private var bTextChanged:Boolean =false;
private var _text:String="ModelText";
public function set text(t:String):void{
this._text =t;
bTextChanged = true;
invalidateProperties();
dispatchEvent(new Event("textChanged"));
}
[Bindable(event="textChanged")]
public function get text():String{
return text_mc.text;
}
override protected function createChildren():void{
super.createChildren();
if(!text_mc){
text_mc =new TextArea();
text_mc.explicitWidth =80;
text_mc.editable =false;
text_mc.addEventListener("change",handleChangeEvent);
addChild(text_mc);
}
if(!mode_mc){
mode_mc = new Button();
mode_mc.label ="mylabeljieji";
mode_mc.addEventListener("click",handleClickEvent);
addChild(mode_mc);
}
}
//处理有子组件派发的时间
private function handleChangeEvent(eventObj:Event):void{
dispatchEvent(new Event("change"));
}
private function handleClickEvent(eventObj:Event):void{
text_mc.editable = !text_mc.editable;
}
override protected function commitProperties():void{
super.commitProperties();
if(bTextChanged){
bTextChanged =false;
text_mc.text = _text;
invalidateDisplayList();
}
}
/**
* 组建的默认宽度是文本宽度加上按钮的宽度
* 组件的默认高度由按钮的高度决定
*/
override protected function measure():void{
super.measure();
var buttonWidth:Number = mode_mc.getExplicitOrMeasuredWidth();
var buttonHeight:Number =mode_mc.getExplicitOrMeasuredHeight();
//组件默认的最小宽度和默认宽度为textArea控件的measureedWidth宽度与buttonWidth之和
measuredWidth = measuredMinWidth =text_mc.measuredWidth+buttonWidth;
//组件的默认高度 和最小高度问textArea 和Button 中measuredHeight中的最大值加上10个像素的边框
measuredHeight = measuredMinHeight = Math.max(text_mc.measuredHeight,buttonHeight)+10;
}
private var _textPlacement:String="left";
public function set textPlacement(p:String):void{
this._textPlacement = p;
invalidateDisplayList();
dispatchEvent(new Event("placementChanged"));
}
[Bindable(event="placementChanged")]
public function get textPlacement():String{
return _textPlacement;
}
/**
* Button控件的尺寸是Button上的label文本尺寸加上10像素的边框区域
* textarea控件的尺寸是组件的剩余区域,TextArea的位置取决于textPlacement属性的设置
* **/
override protected function updateDisplayList(unscaledWidth:Number, unscaledHeight:Number):void{
super.updateDisplayList(unscaledWidth,unscaledHeight);
//为左右边框各减去1像素 , 为左右边白各减3像素
var usableWidth:Number=unscaledWidth -8;
//为上下边框各减去1像素 , 为上下边白各减3像素
var usableHeight:Number = unscaledHeight -8;
//根据按钮上的文本计算按钮的尺寸
var lineMetrics:TextLineMetrics = measureText(mode_mc.label);
//按钮文本尺寸加上10像素作为按钮的尺寸
var buttonHeight:Number = lineMetrics.height+10;
var buttonWidth:Number = lineMetrics.width+10;
mode_mc.setActualSize(buttonWidth,buttonHeight);
//计算文本的尺寸,允许按钮和TextArea文本之间有5个像素的间隙
var textWidth:Number = usableWidth-buttonWidth-5;
var textHeight:Number = usableHeight;
text_mc.setActualSize(textWidth,textHeight);
//根据textPlacement的属性确定控件的位置
if(textPlacement == "left"){
text_mc.move(4,4);
mode_mc.move(4+textWidth+5,4);
}else{
mode_mc.move(4,4);
text_mc.move(4+buttonWidth+5,4);
}
graphics.lineStyle(1,0xffff00,1.0);
graphics.drawRect(0,0,unscaledWidth,unscaledHeight);
}
}
}
flex 自定义组件的编写的更多相关文章
- Flex自定义组件开发之日周月日期选择日历控件
原文:Flex自定义组件开发之日周月日期选择日历控件 使用过DateField的我们都知道,DateField 控件是用于显示日期的文本字段,字段右侧带有日历图标.当用户在控件边框内的 ...
- Flex自定义组件、皮肤,并调用
标签:Flex 自定义组件 自定义皮肤 主应用调用模块 本程序样例学习自flex 实战教程.但因原教程代码不全,且根据个人需求有更改. 1文件列表 自定义as类Reveal.as,该类实现组件的 ...
- Flex自定义组件开发 - jackyWHJ
一般情况下需要组件重写都是由于以下2个原因: 1.在FLEX已有组件无法满足业务需求,或是需要更改其可视化外观等特性时,直接进行继承扩展. 2.为了模块化设计或进一步重用,需要对FLEX组件进行组合. ...
- Flex自定义组件开发
一般情况下需要组件重写都是由于以下2个原因:1.在FLEX已有组件无法满足业务需求,或是需要更改其可视化外观等特性时,直接进行继承扩展.2.为了模块化设计或进一步重用,需要对FLEX组件进行组合.而F ...
- 【Flex】自定义组件学习
文件列表 主文件: index.mxml 自定义组件 components.mylogo.mxml 图img a.jpg 2 mylogo.mxml <s:Group xmlns:fx=&q ...
- Yii2.0 高级模版编写使用自定义组件(component)
翻译自:http://www.yiiframework.com/wiki/760/yii-2-0-write-use-a-custom-component-in-yii2-0-advanced-tem ...
- 小程序 模态对话框自定义组件(modal)
1. 概述 1.1 说明 小程序中使用wx.showModal(Object object)打开一个模态对话框,但是目前小程序所提供的modal中的内容显示比较死板,不能够完全满足工作中所遇到的功能信 ...
- 微信小程序自定义组件实现
官方从 1.6.3 开始对于自定义组件这一块有了比较大的变动,首先比较明显的感觉就是文档比以前全多了,有木有!,现在小程序支持简洁的组件化编程,可以将页面内的功能模块抽象成自定义组件,以便在不同的页面 ...
- 微信小程序自定义组件
要做自定义组件,我们先定一个小目标,比如说我们在小程序中实现一下 WEUI 中的弹窗组件,基本效果图如下. Step1 我们初始化一个小程序(本示例基础版本库为 1.7 ),删掉里面的示例代码,并新建 ...
随机推荐
- Jmeter入门--断言(检查点)
断言是在请求的返回层面增加一层判断机制.因为请求成功,并不代表结果一定正确,因为此需要检查机制提高测试准确性. 1.响应断言 模式匹配规则: 包括:返回结果包括你指定的内容,支持正则匹配 例如: 响应 ...
- SweetAlert插件 弹框插件
sweetalert是一个漂亮的弹窗 中文网址: http://mishengqiang.com/sweetalert/ 它需要2个文件:sweetalert-dev.js和sweetalert.cs ...
- 汽车学习---汽车知识大全【all】
汽车驱动/发动机/大灯 侧方位停车和倒车入库技巧 手动挡车型 换档8大技巧 常见的掉头情况注意事项 最全的左转,右转,待转,掉头方法 开车技巧大汇总,尤其适合新手司机 汽车常识扫盲,不做“汽车小白”! ...
- 3星|《结构思考力》:用金字塔原理整理PPT的思路,案例偏简单
结构思考力 名义上全书是讲结构化思考,实际内容是用结构化思考的方法来整理PPT的思路,让PPT的逻辑更清晰.少部分提到如何修改标题更吸引人,如何做图表设计. 书中结构化思考的基本思路,重要的有两个:1 ...
- NTRIP协议学习(一)
这篇博客讲得很清晰. https://blog.csdn.net/sinat_19447667/article/details/67637167 可以参考的文献包括:<多系统GNSS实时数据质 ...
- 缓冲区溢出基础实践(二)——ROP 与 hijack GOT
3.ROP ROP 即 Return Oritented Programming ,其主要思想是在栈缓冲区溢出的基础上,通过程序和库函数中已有的小片段(gadgets)构造一组串联的指令序列,形成攻击 ...
- css背景精华所在+前端页面开发流程
background属性 background属性是css中应用比较多,且比较重要的一个属性,它是负责给盒子设置背景图片和背景颜色的,background是一个复合属性,它可以分解成如下几个设置项: ...
- VMware常见错误故障排查
1. VMware安装失败 “Failed to create the requested registry key Key:installer Error:1021" 1.1. windo ...
- C#软件授权、注册、加密、解密模块源码解析并制作注册机生成license
最近做了一个绿色免安装软件,领导临时要求加个注册机制,不能让现场工程师随意复制.事出突然,只能在现场开发(离开现场软件就不受我们控了).花了不到两个小时实现了简单的注册机制,稍作整理. ...
- OOP——构造函数、析构函数
我们在创建和销毁对象时需要执行一些任务.例如,在创建对象时给属性赋值,在对象销毁时关闭数据连接等,这时就需要构造函数和析构函数. 在PHP中构造函数和析构函数是固定的,如下: // 构造函数 func ...