现在的位置: 首页 > 综合 > 正文

flex 自定义组件的编写

2013年10月18日 ⁄ 综合 ⁄ 共 5749字 ⁄ 字号 评论关闭

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 组合的自定义组件

Java代码
复制代码

收藏代码
  1. package cn.tsoft 
  2.     import flash.events.Event; 
  3.     import flash.text.TextLineMetrics; 
  4.      
  5.     import mx.controls.Button; 
  6.     import mx.controls.TextArea; 
  7.     import mx.core.UIComponent; 
  8.      
  9.      
  10.      
  11.     /**
  12.      * 当子组件textArea中文件变化时,ModelText派发一个change事件
  13.      * 当ModelText的text属性被设置时,派发一个textChange事件
  14.      * 当改变Modeltext的textplacement属性后,会派发一个placementChanged事件
  15.      * **/ 
  16.     [Event(name="change",type="flash.events.Event")] 
  17.     [Event(name="textChanged",type="flash.events.Event")] 
  18.     [Event(name="placementChanged",type="flash.events.Event")] 
  19.      
  20.     public class ModelText
    extends UIComponent 
  21.     { 
  22.         public function ModelText() 
  23.         { 
  24.             super(); 
  25.         } 
  26.          
  27.         private var text_mc:TextArea; 
  28.         private var mode_mc:Button; 
  29.          
  30.          
  31.         private var bTextChanged:Boolean =false
  32.          
  33.         private var _text:String="ModelText"
  34.          
  35.          
  36.         public function set text(t:String):void
  37.             this._text =t; 
  38.             bTextChanged = true
  39.             invalidateProperties(); 
  40.             dispatchEvent(new Event("textChanged")); 
  41.         } 
  42.          
  43.          
  44.         [Bindable(event="textChanged")] 
  45.         public function get text():String{ 
  46.             return text_mc.text; 
  47.         } 
  48.          
  49.          
  50.         override protected function createChildren():void
  51.             super.createChildren(); 
  52.             if(!text_mc){ 
  53.                 text_mc =new TextArea(); 
  54.                 text_mc.explicitWidth =80
  55.                 text_mc.editable =false
  56.                 text_mc.addEventListener("change",handleChangeEvent); 
  57.                 addChild(text_mc); 
  58.             } 
  59.              
  60.             if(!mode_mc){ 
  61.                 mode_mc = new Button(); 
  62.                 mode_mc.label ="mylabeljieji"
  63.                 mode_mc.addEventListener("click",handleClickEvent); 
  64.                 addChild(mode_mc); 
  65.             } 
  66.         } 
  67.          
  68.          
  69.         //处理有子组件派发的时间 
  70.         private function handleChangeEvent(eventObj:Event):void
  71.             dispatchEvent(new Event("change")); 
  72.         } 
  73.          
  74.         private function handleClickEvent(eventObj:Event):void
  75.             text_mc.editable = !text_mc.editable; 
  76.         } 
  77.          
  78.          
  79.         override protected function commitProperties():void
  80.             super.commitProperties(); 
  81.             if(bTextChanged){ 
  82.                 bTextChanged =false
  83.                 text_mc.text = _text; 
  84.                 invalidateDisplayList(); 
  85.             } 
  86.         } 
  87.          
  88.         /**
  89.          * 组建的默认宽度是文本宽度加上按钮的宽度
  90.          * 组件的默认高度由按钮的高度决定
  91.          */  
  92.         override protected function measure():void
  93.             super.measure(); 
  94.             var buttonWidth:Number = mode_mc.getExplicitOrMeasuredWidth(); 
  95.             var buttonHeight:Number =mode_mc.getExplicitOrMeasuredHeight(); 
  96.              
  97.             //组件默认的最小宽度和默认宽度为textArea控件的measureedWidth宽度与buttonWidth之和 
  98.             measuredWidth = measuredMinWidth =text_mc.measuredWidth+buttonWidth; 
  99.         //组件的默认高度 和最小高度问textArea 和Button 中measuredHeight中的最大值加上10个像素的边框 
  100.             measuredHeight = measuredMinHeight = Math.max(text_mc.measuredHeight,buttonHeight)+10
  101.         } 
  102.          
  103.          
  104.         private var _textPlacement:String="left"
  105.          
  106.         public function set textPlacement(p:String):void
  107.             this._textPlacement = p; 
  108.             invalidateDisplayList(); 
  109.             dispatchEvent(new Event("placementChanged")); 
  110.         } 
  111.          
  112.         [Bindable(event="placementChanged")] 
  113.         public function get textPlacement():String{ 
  114.             return _textPlacement; 
  115.         } 
  116.          
  117.          
  118.         /**
  119.          * Button控件的尺寸是Button上的label文本尺寸加上10像素的边框区域
  120.          * textarea控件的尺寸是组件的剩余区域,TextArea的位置取决于textPlacement属性的设置
  121.          * **/ 
  122.         override protected function updateDisplayList(unscaledWidth:Number, unscaledHeight:Number):void
  123.             super.updateDisplayList(unscaledWidth,unscaledHeight); 
  124.             //为左右边框各减去1像素 , 为左右边白各减3像素 
  125.             var usableWidth:Number=unscaledWidth -8
  126.             //为上下边框各减去1像素 , 为上下边白各减3像素 
  127.             var usableHeight:Number = unscaledHeight -8
  128.              
  129.             //根据按钮上的文本计算按钮的尺寸 
  130.             var lineMetrics:TextLineMetrics = measureText(mode_mc.label); 
  131.             //按钮文本尺寸加上10像素作为按钮的尺寸 
  132.             var buttonHeight:Number = lineMetrics.height+10
  133.             var buttonWidth:Number = lineMetrics.width+10
  134.             mode_mc.setActualSize(buttonWidth,buttonHeight); 
  135.              
  136.             //计算文本的尺寸,允许按钮和TextArea文本之间有5个像素的间隙 
  137.             var textWidth:Number = usableWidth-buttonWidth-5
  138.             var textHeight:Number = usableHeight; 
  139.             text_mc.setActualSize(textWidth,textHeight); 
  140.              
  141.             //根据textPlacement的属性确定控件的位置 
  142.             if(textPlacement ==
    "left"){ 
  143.                 text_mc.move(4,4); 
  144.                 mode_mc.move(4+textWidth+5,4); 
  145.             }else
  146.                 mode_mc.move(4,4); 
  147.                 text_mc.move(4+buttonWidth+5,4); 
  148.             } 
  149.              
  150.             graphics.lineStyle(1,0xffff00,1.0); 
  151.             graphics.drawRect(0,0,unscaledWidth,unscaledHeight); 
  152.         } 
  153.          
  154.          
  155.  
  156.     } 
  157. }

 

转自:http://wangxingrang.iteye.com/blog/1489400

抱歉!评论已关闭.