`

flex 自定义组件的编写

    博客分类:
  • 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);
		}
		
		

	}
}



分享到:
评论
2 楼 ruishan123 2015-01-29  
很好
1 楼 jiangyupeng 2012-12-17  

相关推荐

    浅析微信小程序自定义日历组件及flex布局最后一行对齐问题

    最近为我开源的小项目:微信小程序扩展自定义组件库(点击去GitHub) 增加了一个新组件 —— 日历组件。 效果演示: 在编写过程中,因为大家都知道,日历组件是有固定行数和每一行的固定列数的(即使当前方块内没有...

    styled-flex-component:Flex元素,不再编写更多自定义Flex样式,因为该死

    样式化的Flex组件 Flex元素,不再编写更多自定义Flex样式,因为该死安装yarn add styled-flex-componentornpm i styled-flex-component用法import React from 'react' ;import Flex , { FlexItem } from 'styled-...

    Flex企业应用开发实战源代码

    2.5.4 使用ActionScript创建自定义组件 62 2.6 异步调用 85 2.6.1 异步调用导致模型数据不一致 85 2.6.2 异步调用导致用户反复(误)操作 86 2.7 小结 87 第3章 Flex企业应用开发中的主要元素 88 3.1 企业应用...

    iron-flex-layout:跨平台灵活框布局的样式混合

    请注意,这是一个旧元素,它是在所有现代浏览器都具有非前缀的flex样式之前编写的。 因此,如今,您实际上不再需要使用此元素,并且可以直接在代码中使用CSS Flex样式。 请参阅:, 。 该组件提供了两种不同的...

    Flex_4:开发RIA_应用程序.pdf

    了解Flex 组件 ................................................................................................................................................ 34 分配组件属性 ...........................

    gatsby-themes:盖茨比(Gatsby)主题,用于快速建立网站。 我们正在研究Flex主题的下一个版本。 见https

    Flex是Gatsby主题,可让您通过在Markdown文件中编写简单的组件来构建网站。 凤凰 结合博客,作品集,摄影和播客的Gatsby主题。 它使用Tailwind CSS进行主题设置,并包括使用Prism,RSS feed,深色模式和出色的排版...

    spaceX-Launch-Program:开发一个前端应用程序,该应用程序将帮助用户通过SpaceX程序列出和浏览所有发射

    没有使用第三方库,已经在自定义CSS中编写了竞争CSS代码(Flex-Layout | Media Query) The design layout devided into two sections - LEFT(Filter Section) and RIGHT (Cards Section) 在左侧部分,我们有相应...

    tview:用Go编写的用于终端UI的丰富交互式小部件

    它们带有许多自定义选项,可以轻松扩展以满足您的需求。 安装 go get github.com/rivo/tview 你好,世界 这个基本示例创建了一个标题为“ Hello,World!”的框。 并将其显示在您的终端中: package main import ( ...

    oneui:一个简单的基于react和styled-components的高级风格ui库

    使用Flex布局和CSS3样式编写规范。 特征 使用一个UI,您可以构建所需的任何前端UI界面。灵活,自定义您的任何UI界面。遵循All in js的想法,让CSS样式传递诸如React组件之类的参数,并通过Styled-Components编译前端...

    asp.net知识库

    使用microsoft.web.ui.webcontrols的TabStrip与IFame组件,达到页的切换效果 HttpModule 实现 ASP.Net (*.aspx) 中文简繁体的自动转换,不用修改原有的任何代码,直接部署即可! 服务器自定义开发二之客户端脚本回发 Web...

    ActionScript开发技术大全

    8.4.3自定义异常类型 166 8.5小结 167 第3篇ActionScript3.0可视化编程 第9章可视化编程基础 170 9.1可视化编程模型 170 9.1.1可视化编程概述 170 9.1.2可视对象 172 9.1.3可视对象列表 175 9.1.4可视对象管理函数 ...

    Spring攻略(第二版 中文高清版).part2

    1.14 从Classpath中扫描组件 50 1.14.1 问题 50 1.14.2 解决方案 51 1.14.3 工作原理 51 1.15 小结 56 第2章 高级Spring IoC容器 57 2.1 调用静态工厂方法创建Bean 57 2.1.1 问题 57 2.1.2 解决...

    Spring攻略(第二版 中文高清版).part1

    1.14 从Classpath中扫描组件 50 1.14.1 问题 50 1.14.2 解决方案 51 1.14.3 工作原理 51 1.15 小结 56 第2章 高级Spring IoC容器 57 2.1 调用静态工厂方法创建Bean 57 2.1.1 问题 57 2.1.2 解决...

    Maven权威指南 很精典的学习教程,比ANT更好用

    编写接口项目程序 8. 优化和重构POM 8.1. 简介 8.2. POM清理 8.3. 优化依赖 8.4. 优化插件 8.5. 使用Maven Dependency插件进行优化 8.6. 最终的POM 8.7. 小结 II. Maven Reference 9. 项目对象模型 ...

    软件界面设计工具_3款合集

    通过现有元素或其它自定义控件创建自定义控制组件。 在其它设计中创建将要使用的控件设计。 以常用的文件格式添加图标与图片。 从能够显示您将获得什么的控件面板中进行拖放操作。 属性编辑程序使您能将每个元素...

Global site tag (gtag.js) - Google Analytics