Flex组件的项目渲染器(ItemRenderer)使用总结

 

Flex组件的项目渲染器(ItemRenderer)使用总结 
系列文章导航
Flex,Fms3相关文章索引 
Air版免费视频成人聊天室,免费网络远程视频会议系统((Flex,Fms3联合打造)) 
 
 

Flex中提供了大量用于数据呈现的组件,这其中,以List系列组件最为常见,使用也最频繁,比如ComBoBox、List、Tree、TileList、DataGrid等等。这些组件有一个共同的特性,那就是支持自定义itemRenderer,这个功能非常强大,能够帮助我们实现很多实用的功能. 

项目渲染器(ItemRenderer)是ListBase类列表控件的重要属性,我们在平常工作中会经常自定义项目渲染器以实现该类控件的特殊显示效果。 

默认的项目渲染器取决于组件类。TileList 和 HorizontalList 类使用 TileListItemRenderer;List 类使用 ListItemRenderer。DataGrid 类使用 DataGridColumn 中的 DataGridItemRenderer。 

什么是itemRenderer? 
itemRenderer,可以理解为数据的表现方式,具体地说,是指显示每一条数据时采用的形式。在使用数据处理类组件时,我们只需要把数据按照一定的格式组织好,然后赋予给组件,剩下的事就不用费心了。 
每一个组件都有默认的itemRenderer,比如List组件: 
List组件默认的itemRenderer类似Label组件,只简单显示一行文本。如右图所示,红色方框选中的是一个itemRenderer。 
本质上,itemRenderer和其它容器类组件没有区别,里面可以包括任意的可视化元素,包括文本、图片、视频等,只要是Flex支持的视觉元素,都可以。 

自定义itemRenderer 
组件默认的itemRenderer都过于简单,如果想加强表现力,就必须创建个性化的itemRenderer。 
自定义itemRenderer有两种方式:一种是嵌入式,直接写在组件的标签中,所有的代码都集中在一个MXML文件中;另一种是把itemRenderer独立出来,形成一个MXML组件或ActionScript类。 

 

看下面图片,我用TileList控件的自定义ItemRenderer实现的效果:

 

 

代码下载:

http://files.cnblogs.com/aierong/Air_TestWin.rar

 

 

代码说明:

先自定义一个名称为:itemh的MXML

<?xml version="1.0" encoding="utf-8"?> 
<mx:HBox xmlns:mx="http://www.adobe.com/2006/mxml" width="145" height="41" 
         horizontalScrollPolicy="off" verticalScrollPolicy="off"> 

    <mx:VBox width="40" height="100%" horizontalScrollPolicy="off" verticalScrollPolicy="off"> 
        <mx:Image click="this.parentDocument.imgclick(event)" 
                  data="{data.label}" source="assets\tx.JPG" width="40"/> 
    </mx:VBox> 
    <mx:VBox width="95" height="100%" horizontalScrollPolicy="off" verticalScrollPolicy="off"> 
        <mx:Label text="{data.label}" toolTip="{data.label}" /> 
        <mx:Image toolTip="点我查看视频"  buttonMode="true" 
                  source="assets\camera.JPG" width="16" height="20"  /> 
    </mx:VBox> 

</mx:HBox>

 

主调用应用中:

<mx:ArrayCollection id="arrColl_keySetup"> 
    <mx:source> 
        <mx:Array id="arr_keysetup"> 
            <mx:Object data="00" sel="false" label="aaa"/> 
            <mx:Object data="11" sel="false" label="bbb"/> 
            <mx:Object data="22" sel="true" label="ccc"/> 
        </mx:Array> 
    </mx:source> 
</mx:ArrayCollection> 

<mx:TileList id="tlist" maxColumns="1" 
    dataProvider="{arrColl_keySetup}"  
    itemRenderer="itemh" 
    x="34" y="10" width="148"> 
</mx:TileList>

 

给TileList的itemRenderer属性赋值itemh,并绑定数组集合类就可以了。

 

动态指定itemRenderer

利用ClassFactory类可以动态指定itemRenderer

代码如下:

private function initTileList():void 
{ 
    this.tlist.dataProvider=this.arrColl_keySetup; 
    this.tlist.itemRenderer = new  ClassFactory(itemh); 
}

<mx:TileList id="tlist" maxColumns="1" x="34" y="10" width="148" 
    creationComplete="initTileList()"> 
</mx:TileList>

 

 

至于怎样在项目渲染器访问主调用应用中的成员,可用parentDocument来引用; 
反过来,主调用应用要访问项目渲染器中的成员,一般都是通过在项目渲染器先派发事件,然后在主调用应用中注册事件侦听器来实现。 

例如:在项目渲染器中点击图片事件,然后通知主调用应用

<mx:Image click="this.parentDocument.imgclick(event)" 
                  data="{data.label}" source="assets\tx.JPG" width="40"/> 

在主调用应用中定义:

public function imgclick(evt:MouseEvent):void 
{ 
    var img:Image=evt.currentTarget as Image; 
    Alert.show(img.data.toString()); 
}

记住得是public的,不同类之间是无法访问私有方法的

图片点击后效果图片:

 

其实上面的功能也可以用dispatchEvent来实现

先定义一个事件类

package 
{ 
    import flash.events.Event; 
    public class myEvent extends Event 
    { 
        public var data:String; 
        public function myEvent(type:String, bubbles:Boolean=false, cancelable:Boolean=false,data:String="") 
        { 
            super(type, bubbles, cancelable); 
            this.data=data; 
        } 
    } 
}

然后在itemh中将事件调度到事件流中

<mx:Image click="clickHandler(event)" 
          data="{data.label}" source="assets\tx.JPG" width="40"/>

private function clickHandler(evt:MouseEvent):void 
{ 
    var img:Image=evt.currentTarget as Image; 
    dispatchEvent(new  myEvent("img_click",true,true,img.data.toString())); 
}

最后在主调应用中监听事件

private function initTileList():void 
{ 
    this.tlist.addEventListener("img_click",onItemimg_click); 
} 

private function onItemimg_click(evt:myEvent):void 
{ 
    Alert.show(evt.data); 
}

<mx:TileList id="tlist" maxColumns="1" x="34" y="10" width="148" 
    dataProvider="{arrColl_keySetup}" itemRenderer="itemh" 
    creationComplete="initTileList()"> 
</mx:TileList>

 

 

 

其实也可以用<mx:itemRenderer>和<mx:Component>标签来声明itemRenderer

例如以上代码可以改为:

<mx:Script> 
    <![CDATA[ 
        import mx.controls.Image; 
        import mx.controls.Alert; 

        public function imgclick(evt:MouseEvent):void 
        { 
            var img:Image=evt.currentTarget as Image; 

            Alert.show(img.data.toString()); 
        } 
    ]]> 
</mx:Script> 

<mx:ArrayCollection id="arrColl_keySetup"> 
    <mx:source> 
        <mx:Array id="arr_keysetup"> 
            <mx:Object data="00" sel="false" label="aaa"/> 
            <mx:Object data="11" sel="false" label="bbb"/> 
            <mx:Object data="22" sel="true" label="ccc"/> 
        </mx:Array> 
    </mx:source> 
</mx:ArrayCollection> 

<mx:TileList id="tlist" maxColumns="1" 
             dataProvider="{arrColl_keySetup}"  
             x="34" y="10" width="148"> 
    <mx:itemRenderer> 
        <mx:Component> 
            <mx:HBox width="145" height="41" horizontalScrollPolicy="off" verticalScrollPolicy="off"> 
                <mx:VBox width="40" height="100%" horizontalScrollPolicy="off" verticalScrollPolicy="off"> 
                    <mx:Image click="this.parentDocument.imgclick(event)" 
                        data="{data.label}" buttonMode="true" source="assets\tx.JPG" width="40"/> 
                </mx:VBox> 
                <mx:VBox width="95" height="100%" horizontalScrollPolicy="off" verticalScrollPolicy="off"> 
                    <mx:Label text="{data.label}" toolTip="{data.label}"/> 
                    <mx:Image toolTip="点我查看视频" buttonMode="true" 
                        source="assets\camera.JPG" width="16" height="20"/> 
                </mx:VBox> 
            </mx:HBox> 
        </mx:Component> 
    </mx:itemRenderer> 
</mx:TileList> 

 

再提供2个比较好的例题

http://blog.minidx.com/2008/10/03/1457.html

http://blog.minidx.com/2008/03/09/559.html

 


 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
智慧校园整体解决方案是响应国家教育信息化政策,结合教育改革和技术创新的产物。该方案以物联网、大数据、人工智能和移动互联技术为基础,旨在打造一个安全、高效、互动且环保的教育环境。方案强调从数字化校园向智慧校园的转变,通过自动数据采集、智能分析和按需服务,实现校园业务的智能化管理。 方案的总体设计原则包括应用至上、分层设计和互联互通,确保系统能够满足不同用户角色的需求,并实现数据和资源的整合与共享。框架设计涵盖了校园安全、管理、教学、环境等多个方面,构建了一个全面的校园应用生态系统。这包括智慧安全系统、校园身份识别、智能排课及选课系统、智慧学习系统、精品录播教室方案等,以支持个性化学习和教学评估。 建设内容突出了智慧安全和智慧管理的重要性。智慧安全管理通过分布式录播系统和紧急预案一键启动功能,增强校园安全预警和事件响应能力。智慧管理系统则利用物联网技术,实现人员和设备的智能管理,提高校园运营效率。 智慧教学部分,方案提供了智慧学习系统和精品录播教室方案,支持专业级学习硬件和智能化网络管理,促进个性化学习和教学资源的高效利用。同时,教学质量评估中心和资源应用平台的建设,旨在提升教学评估的科学性和教育资源的共享性。 智慧环境建设则侧重于基于物联网的设备管理,通过智慧教室管理系统实现教室环境的智能控制和能效管理,打造绿色、节能的校园环境。电子班牌和校园信息发布系统的建设,将作为智慧校园的核心和入口,提供教务、一卡通、图书馆等系统的集成信息。 总体而言,智慧校园整体解决方案通过集成先进技术,不仅提升了校园的信息化水平,而且优化了教学和管理流程,为学生、教师和家长提供了更加便捷、个性化的教育体验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值