Flex例子--通过继承增加新的功能

Flex中通过继承可以为新组件增加新的功能,如通过注入方法,改变背景色,改变位置和高度等。这里主要掌握原组件的一些特性,属性和方法,以便根据需要的功能加以覆写(也可以自己扩展),达到自己想要的效果。下面是一个简单的例子
1、新建MyDataGrid.as,继承DataGrid,覆写drawRowBackground方法,注入rowColorFunction方法。
Java代码
  1. package com.test   
  2. {   
  3.     import flash.display.Sprite;   
  4.        
  5.     import mx.controls.Alert;   
  6.     import mx.controls.DataGrid;   
  7.     import mx.controls.dataGridClasses.DataGridColumn;   
  8.   
  9.     public class MyDataGrid extends DataGrid   
  10.     {   
  11.         private var _rowColorFunction:Function;   
  12.            
  13.         public function MyDataGrid()   
  14.         {   
  15.             super();   
  16.         }   
  17.         //为MyDataGrid注入函数,get set   
  18.         public function set rowColorFunction(f:Function):void{   
  19.             this._rowColorFunction = f;   
  20.         }   
  21.            
  22.         public function get rowColorFunction():Function{   
  23.             return this._rowColorFunction;   
  24.         }   
  25.            
  26.         //覆写drawRowBackground方法,可改变位置、高度、颜色等,这里只改变背景颜色   
  27.         override protected function drawRowBackground(s:Sprite, rowIndex:int, y:Number, height:Number, color:uint, dataIndex:int):void{   
  28.             ifthis.rowColorFunction != null ){   
  29.                 if( rowIndex < this.dataProvider.length && rowIndex < this.listItems.length && this.listItems[rowIndex].length>0){   
  30.                     var data:XML =  this.listItems[rowIndex][0].data;   
  31.                     color = this.rowColorFunction.call(this,data,color);   
  32.                 }else{   
  33.                     color = this.rowColorFunction.call(this,null,color);   
  34.                 }   
  35.             }   
  36.             super.drawRowBackground(s, rowIndex, y, height, color, dataIndex);   
  37.         }   
  38.     }   
  39. }  
package com.test
{
	import flash.display.Sprite;
	
	import mx.controls.Alert;
	import mx.controls.DataGrid;
	import mx.controls.dataGridClasses.DataGridColumn;

	public class MyDataGrid extends DataGrid
	{
		private var _rowColorFunction:Function;
		
		public function MyDataGrid()
		{
			super();
		}
		//为MyDataGrid注入函数,get set
		public function set rowColorFunction(f:Function):void{
			this._rowColorFunction = f;
		}
		
		public function get rowColorFunction():Function{
			return this._rowColorFunction;
		}
		
		//覆写drawRowBackground方法,可改变位置、高度、颜色等,这里只改变背景颜色
		override protected function drawRowBackground(s:Sprite, rowIndex:int, y:Number, height:Number, color:uint, dataIndex:int):void{
	    	if( this.rowColorFunction != null ){
	    		if( rowIndex < this.dataProvider.length && rowIndex < this.listItems.length && this.listItems[rowIndex].length>0){
		    		var data:XML =  this.listItems[rowIndex][0].data;
		    		color = this.rowColorFunction.call(this,data,color);
	    		}else{
	    			color = this.rowColorFunction.call(this,null,color);
	    		}
	    	}
		    super.drawRowBackground(s, rowIndex, y, height, color, dataIndex);
        }
	}
}

2、新建MyDataGridTest.mxml文件,MyDataGrid中可以使用已经注入的方法rowColorFunction
Java代码 复制代码
  1. <?xml version="1.0" encoding="utf-8"?>   
  2. <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute"  
  3.      initialize="init()" xmlns:md="com.test.*" width="600" height="300">   
  4.        
  5.     <mx:Script>   
  6.         <![CDATA[   
  7.             import mx.controls.Alert;   
  8.             import mx.rpc.events.ResultEvent;   
  9.                
  10.             private var dataXml:XML;   
  11.                
  12.             private function init():void {   
  13.                 dataXmlService.url = "students.xml";//可改成具体请求方式   
  14.                 try{   
  15.                     dataXmlService.send();   
  16.                 }catch(e:IOError){   
  17.                     Alert.show("请求出错");   
  18.                 }   
  19.             }   
  20.                
  21.             private function dataXmlToData(evt:ResultEvent):void{   
  22.                 dataXml = XML(evt.result);   
  23.                 //提供数据源   
  24.                 myDataGrid.dataProvider = dataXml.children();   
  25.             }   
  26.                
  27.             //设置行背景色的方法   
  28.             private function getRowColor(data:Object,color:uint):Object {   
  29.                 if(data==nullreturn 0xFFFFFF;   
  30.                    
  31.                 return data.@color;   
  32.             }   
  33.         ]]>   
  34.     </mx:Script>   
  35.        
  36.     <mx:HTTPService id="dataXmlService" resultFormat="xml" result="dataXmlToData(event)" />   
  37.     <!--使用自己定义的组件MyDataGrid,可以使用已经注入的方法rowColorFunction -->   
  38.     <md:MyDataGrid id="myDataGrid" rowColorFunction="getRowColor" x="23.5" y="5" width="553" height="275" fontSize="12" fontWeight="normal">   
  39.         <md:columns>   
  40.             <mx:DataGridColumn headerText="学号" dataField="@col1"/>   
  41.             <mx:DataGridColumn headerText="姓名" dataField="@col2"/>   
  42.             <mx:DataGridColumn headerText="年龄" dataField="@col3"/>   
  43.             <mx:DataGridColumn headerText="爱好" dataField="@col4"/>   
  44.             <mx:DataGridColumn headerText="住址" dataField="@col5"/>   
  45.         </md:columns>   
  46.     </md:MyDataGrid>   
  47. </mx:Application>  
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute"
	 initialize="init()" xmlns:md="com.test.*" width="600" height="300">
	
	<mx:Script>
		<![CDATA[
			import mx.controls.Alert;
			import mx.rpc.events.ResultEvent;
			
			private var dataXml:XML;
			
			private function init():void {
				dataXmlService.url = "students.xml";//可改成具体请求方式
				try{
					dataXmlService.send();
				}catch(e:IOError){
					Alert.show("请求出错");
				}
			}
			
			private function dataXmlToData(evt:ResultEvent):void{
				dataXml = XML(evt.result);
				//提供数据源
				myDataGrid.dataProvider = dataXml.children();
			}
			
			//设置行背景色的方法
			private function getRowColor(data:Object,color:uint):Object {
				if(data==null) return 0xFFFFFF;
				
				return data.@color;
			}
		]]>
	</mx:Script>
	
	<mx:HTTPService id="dataXmlService" resultFormat="xml" result="dataXmlToData(event)" />
	<!--使用自己定义的组件MyDataGrid,可以使用已经注入的方法rowColorFunction -->
	<md:MyDataGrid id="myDataGrid" rowColorFunction="getRowColor" x="23.5" y="5" width="553" height="275" fontSize="12" fontWeight="normal">
		<md:columns>
			<mx:DataGridColumn headerText="学号" dataField="@col1"/>
			<mx:DataGridColumn headerText="姓名" dataField="@col2"/>
			<mx:DataGridColumn headerText="年龄" dataField="@col3"/>
			<mx:DataGridColumn headerText="爱好" dataField="@col4"/>
			<mx:DataGridColumn headerText="住址" dataField="@col5"/>
		</md:columns>
	</md:MyDataGrid>
</mx:Application>

3、使用的xml数据students.xml和显示效果
Java代码 复制代码
  1. <?xml version="1.0" encoding="UTF-8"?>   
  2. <datas>   
  3. <data col1="2100" col2="张三" col3="20" col4="篮球" col5="北京" color="0x8DFEFE" />   
  4. <data col1="2101" col2="张四" col3="21" col4="篮球" col5="北京" color="0x8DFEFE" />   
  5. <data col1="2102" col2="张五" col3="22" col4="篮球" col5="北京" color="0x8DFEFE" />   
  6. <data col1="2103" col2="张六" col3="20" col4="篮球" col5="北京" color="0x8DFEFE" />   
  7. <data col1="2104" col2="张七" col3="22" col4="篮球" col5="北京" color="0x8DFEFE" />   
  8. <data col1="2105" col2="张八" col3="22" col4="篮球" col5="北京" color="0xAABBDD" />   
  9. <data col1="2106" col2="李四" col3="20" col4="篮球" col5="北京" color="0xAABBDD" />   
  10. <data col1="2107" col2="张大" col3="21" col4="篮球" col5="北京" color="0xAABBDD" />   
  11. <data col1="2108" col2="张关" col3="21" col4="篮球" col5="北京" color="0xAABBDD" />   
  12. <data col1="2109" col2="张看" col3="20" col4="篮球" col5="北京" color="0xAABBDD" />   
  13. </datas>  
<?xml version="1.0" encoding="UTF-8"?>
<datas>
<data col1="2100" col2="张三" col3="20" col4="篮球" col5="北京" color="0x8DFEFE" />
<data col1="2101" col2="张四" col3="21" col4="篮球" col5="北京" color="0x8DFEFE" />
<data col1="2102" col2="张五" col3="22" col4="篮球" col5="北京" color="0x8DFEFE" />
<data col1="2103" col2="张六" col3="20" col4="篮球" col5="北京" color="0x8DFEFE" />
<data col1="2104" col2="张七" col3="22" col4="篮球" col5="北京" color="0x8DFEFE" />
<data col1="2105" col2="张八" col3="22" col4="篮球" col5="北京" color="0xAABBDD" />
<data col1="2106" col2="李四" col3="20" col4="篮球" col5="北京" color="0xAABBDD" />
<data col1="2107" col2="张大" col3="21" col4="篮球" col5="北京" color="0xAABBDD" />
<data col1="2108" col2="张关" col3="21" col4="篮球" col5="北京" color="0xAABBDD" />
<data col1="2109" col2="张看" col3="20" col4="篮球" col5="北京" color="0xAABBDD" />
</datas>

### CSS `flex-shrink` 属性详解 #### 定义与作用 `flex-shrink` 是 Flexbox 布局中的一个重要属性,用于定义当容器的空间不足时,项目应该如何缩小其尺寸。默认情况下,所有弹性项目的收缩因子都是1,这意味着它们会均匀地减少大小来适应容器。 #### 取值范围 - **number**: 正数表示允许该项目按照指定的比例相对于其他项进行缩放;负数值会被当作0处理。 - **initial**: 设置为浏览器默认值(通常是1)。 - **inherit**: 继承父级元素的计算值。 #### 实际应用案例分析 考虑一个简单的例子,在 `.parent` 类中设置了三个子元素,并指定了不同的 `flex-shrink` 和 `flex-basis` 参数[^2]: ```css .parent { display: flex; } .son1, .son2, .son3 { flex-basis: 100px; /* 初始宽度 */ } .son1 { flex-shrink: 1; } .son2 { flex-shrink: 2; } .son3 { flex-shrink: 0; } ``` 在这个场景里,假设总可用空间小于这些子元素的基础宽度之和,则会发生如下变化: - 如果剩余空间不足以容纳所有的孩子节点,`.son1` 将以较小的速度缩减; - `.son2` 缩减速度将是 `.son1` 的两倍; - 而对于 `.son3` 来说,由于它的 `flex-shrink` 设为了0,因此它不会发生任何改变。 这种机制使得开发者可以灵活控制不同组件之间的相对重要性和优先级,从而实现更加复杂的响应式设计效果。 #### 计算方法说明 当遇到空间不够的情况时,Flexbox 会根据各个项目的 `flex-shrink` 比率分配需要移除的空间量。例如在一个拥有多个孩子的容器内,如果有足够的额外空间可供分配给那些具有正向增长系数 (`flex-grow`) 的成员的话,那么就不会触发收缩行为。但是当确实存在溢出问题时,系统将会依据下面这个公式来进行调整: \[ \Delta W_i = (\sum_{j=1}^{n}(W_j * S_j))^{-1} * (C - \sum_{k=1}^{m}B_k) * B_i * S_i\] 其中 \(ΔWi\) 表示第 i 个项目实际减少了多少像素宽高,\(S_i\) 即为其自身的 `flex-shrink` 数值,\(B_i\) 对应于各自的 `flex-basis` 或者当前宽度/高度,而 C 则代表整个容器的实际可利用区域大小。 通过这种方式,即使是在极端条件下也能保持页面布局的整体美观度以及功能性完整性[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值