别指望在NativeWindow里添加Flex组件

别指望在NativeWindow里添加Flex组件

--------------------------------------------------------------------------------
作者: Y.Boy 2009年4月30日
 http://riaoo.com/?p=722


    在AIR里,NativeWindow 窗口没有 addChild() 方法,那也就是说,不能把显示对象直接添加到 NativeWindow 了。发现 NativeWindow 有 stage 属性,这个 stage 是 NativeWindow 窗口舞台,可以往里面添加显示对象。本以为就是这么简单,但,发觉直接往这个 stage 添加 Flex 组件是不行的。就像你想在 flash 里使用 flex 组件一样,行不通。
 
解决办法有二:
 1.使用先进的 Window 组件,抛弃 NativeWindow;
 2.把你想添加到 NativeWindow 窗口里的组件先通过 addChild() 方法添加 到 WindowedApplication 里,确定所有组件都已经 createComplete 后,获得它们的引用。此时,你就可以 close 掉 WindowedApplication,把引用了的组件直接添加到 NativeWindow.stage 里就是了。
 
第一种方法是最佳的,第二种方法是 Window 组件还没出现时的应急措施。

 

Flex:Air的NativeWindow和Window的区别(留意原文的右侧Flash标签云,酷) .
2011-05-15 20:45227人阅读评论(0)收藏举报
http://blog.csdn.net/huanghr_1/article/details/6422950


推荐原因:在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;
 }

posted @ 2012-02-15 13:43  Stranger  阅读(245)  评论(0编辑  收藏  举报