Flex:Air的NativeWindow和Window的区别(留意原文的右侧Flash标签云,酷)

推荐原因:在Air窗口中写HtmlTex用到。     

   由于小软件开发到后期的时候发现自己的美术功底实在不够,于是将程序转为用Flash builder4 beta2开发。但是由于之前几乎没用过Flex开发过任何东西,因此不会Flex,所以在用Flash builder4 beta开发的时候遇到一些问题,解决过程中很是恼火,其中关于打开新窗口的问题很是纠结。

        在开发AIR的过程中,不免要打开一个主程序窗口之外的窗口,这时候有3个方法打开新窗口,分别为NativeWindow和Window。事实上通用的方式使用NativeWindow,而Window是一个Flex封装的方法,被封装在mx.core.Window中,并且内部引用了NativeWindow方法,而createRootWindow则是创建一个基于HTML的窗口。而在使用3个方法的时候,NativeWindow的DIY空间更大,但是它有一个很烦的局限性,那就是不能直接加入Flex组件,只能加入外部Loader进来的SWF或其他元素。

        下面只讨论前两种方法。由于插件问题,代码中所有半角双引号都被替换为了:" 字符。为了避免错误,如要复制代码,请使用代码块上方的工具,点击“view code”可以在新视窗中查看完整无错代码,然后在此视窗复制即可。

        用NativeWindow对象创建新窗口如下:

       var options:NativeWindowInitOptions = new NativeWindowInitOptions();
       options.transparent = true;//true/false
       options.systemChrome = NativeWindowSystemChrome.NONE;//none/STANDARD
       options.type = NativeWindowType.UTILITY;//type="utility";//"normal"//"lightweight"//"utility"
       newWindow= new NativeWindow(options);
       newWindow.title = "新窗口";
       newWindow.stage.align = StageAlign.TOP_LEFT;
       newWindow.stage.scaleMode = StageScaleMode.NO_SCALE;
       newWindow.activate();

         在使用该方法的时候,你不能向newWindow里面添加任何按钮、DateChooser之类的Flex 组件,但是你可以像新窗口的舞台对象里面添加外部加载SWF和Image等元素,具体方法为:newWindow.stage.addChild(someSprite)。

        那么如何在新窗口中动态加入Flex 组件?使用Window方法。代码如下:

	var newWindow:Window=new Window();
        var datePicker:DateChooser=new DateChooser();
	newWindow.transparent=true;
	newWindow.type=NativeWindowType.UTILITY;
	newWindow.systemChrome=NativeWindowSystemChrome.NONE;
	newWindow.addChild(datePicker);
	newWindow.title="新窗口";
	newWindow.height=300;
	newWindow.width=300;
	newWindow.open(true);

         在new一个Window之前,你需要导入该包:import mx.core.Window;(Flash builder4下)。在使用Window方法创建新窗口的时候,可以将其transparent属性设置为true和flase,在设置该属性的时候必须保证open方法未调用才能成功,open方法一旦调用,该属性会被设置为只读。设置为false的时候新窗口将被系统镶边,而设置为true的时候与NativeWindow不同是这时进行组件镶边,即是会自动使用Window内建的UI镶边,而NativeWindow的transparent被设置为true的时候,是没有任何镶边的。在这一点上我很是恼火,因为我既想在新窗口中使用Flex组件,又不想有任何镶边,于是只有兴叹鱼和熊掌不可兼得……

        如何让鱼和熊掌兼得,本人继续探索中……

        补:后来在一个技术群里面说到这个问题的时候,一个网友提供了这种方法让NativeWindow加入Flex组建的方法,即是先New一个Flex组件,等待改组件创建完成后将Flex组件加入到WindowAppliction里面,再加入到NativeWindow窗口中:

	var options:NativeWindowInitOptions = new NativeWindowInitOptions();
	options.transparent = true;//true/false
	options.systemChrome = NativeWindowSystemChrome.NONE;//none/STANDARD
	options.type = NativeWindowType.UTILITY;//type="utility";//"normal"//"lightweight"//"utility"
	newWindow= new NativeWindow(options);
	newWindow.title = "新窗口";
	newWindow.stage.align = StageAlign.TOP_LEFT;
	newWindow.stage.scaleMode = StageScaleMode.NO_SCALE;
	newWindow.activate();
				
	datePicker=new DateChooser();
	this.addElement(datePicker);

	datePicker.addEventListener(FlexEvent.CREATION_COMPLETE,cp);
	
	function cp(e:FlexEvent):void{
		newWindow.stage.addChild(datePicker);
		datePicker.visible=true;
	}


 

 

demo版本所展示的部分功能: 1、创建窗口 2、设置窗口宽高,标题 3、拖拽边缘缩放窗口,拖拽窗口 4、双击顶端的标题栏,最大化和缩放 5、实现不同的窗口机制 等等……………… core核心包结构初略讲解: IWindow接口:定义所有窗口,并且Window实现了该接口 Module类:模块基类 PopModule类:弹出型环境类,继承Module PopWindow类:弹出型窗口,继承Window Window类:窗口基类 WindowEvent类:窗口事件类 WindowsManager类:窗口管理基类 core核心包实现讲解: 凡是flash cs3中继承Module的元件,都可以直接在元件的第一帧撰写代码,并且在编译的过程中会自动把代码编译出来并继承Module类,在第一帧所拽写的代码可以通过实例化后来访问,比如下面贴出的"控制台源码"就是如此写的 如果需要提供特殊环境等,可以继承Module撰写,比如PopModule,控制台的父类就是PopModule,在控制台的源码中,我们可以看得到他直接访问了window属性,得到的就是控制台所在的窗口对象 Window类实现了基本窗口操作,比如拖拽,关闭,显示等,与WindowManager是配套使用 如果需要更复杂的窗口,可以继承Window类撰写,比如PopWindow,FixedWindow类的父类就是PopWindow,在FixedWindow中,我们只需要把PopWindow的状态和模式定死在window和fixed就可以了,而PopWindow本来就是一个普通的窗口,因此创建Create窗口的时候,直接使用PopWindow即可创建一个普通的窗口,在PopWindow中,默认窗口的状态和模式都为window 核心包是另外一个公司做的。核心代码是反编译过来的。代码经过测试能正常运行。 此代码仅供学习,请勿传播。 flash版窗体系统demo观看地址:http://www.xiaos8.com/uploads/flash/window.swf
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值