skip to main |skip to sidebar
显示标签为“AIR”的博文。显示所有博文
显示标签为“AIR”的博文。显示所有博文

2007-12-19

[AIR]Adobe AIR 1.0 Beta 3 的变更详情

执行环境

AIR 支持的 OS 有:

  • Windows Vista Home、Ultimate Edition, Windows XP SP2
  • Windows 2000 SP4 (不支持无缝安装)
  • Mac OS 10.5 Leopard 、 Mac OS 10.4.x Tiger (Intel 与 PowerPC)

AIR 1.0 Beta 1 的执行环境将会在 2007-12-15 开始无法使用。AIR 1.0 Beta 1 用的程序应该及时升级为 AIR 1.0 Beta 3。AIR 1.0 Beta 3 预定为发布正式版前的最后一个测试版,今后应该不会有较大的改变。还有,AIR 1.0 Beta 2 将会在 2008-6-1,AIR 1.0 Beta 3 将会在 2008-11-1 过期。在那以前,AIR 1.0 Beta 2 可以与 AIR 1.0 Beta 3 一起使用,但须先安装 AIR 1.0 Beta 2。

AIR 1.0 Beta 1 的卸载在 Windows 里可以使用"添加/删除",Mac 可以使用程序路径里的"AdobeAIR Unistaller"。注意,删除 AIR 1.0 Beta 3 时,以前的版本将会一起被卸载。

无缝安装的改变

无缝安装即为从浏览器里安装。安装 AIR 1.0 Beta 3 后,AIR 1.0 Beta 2 的无缝安装将会失效。要想继续使用无缝安装,需要使用 AIR 1.0 Beta 3 SDK 里的 AIR 1.0Badge.as 来设置。设置需要 Flash CS3,并且要执行 AIR 1.0 Beta 3 的无缝安装需要 Flash Player 9.0.115.0。

程序描述文件的改变

  • xmlns 变为 "http://ns.adobe.com/air/application/1.0.M6"
  • <title> 标签变为 <name> 标签。
  • <name> 标签变为 <filename> 标签。
  • <handleUpdates> 标签变为 <customUpdateUI> 标签。
  • appId 属性从 <application> 标签的属性变为 <id> 标签。
  • version 属性从 <application>标签的属性变为<version> 标签。
  • <application> 标签添加了 <allowBrowserInvocation> 子标签。
  • <fileType> 标签添加了 <icon> 子标签。

数据库的改变

SQL 的 BLOG 类型将会自动序列化为 ActionScript 3.0 的 ByteArray 类型。在以前的版本里,明确使用了 ByteArray 的需要做处理。

并且,ISQLUserDefinedFunctionSQLUserDefinedFunctionType 将不再支持,应该马上停止使用。

2007-12-09

[AIR]AIR 1.0 = 危险?

今天看了 AIR Security Model(J文),发现 AIR 很危险,比如:

访问系统
AIR可以任意地访问系统。也就是说 AIR等于桌面程序。而 JavaApplet、Google Gear 却为 受限制的访问,这样必究安全。
AIR 1.0 没有提供的
 
AIR 1.0 没有提供安全运行不信任的程序的功能,防止开发者制作安全漏洞的功能,保障绝对安全的沙箱。
安全沙箱不安全
在 AIR 1.0 的两个沙箱(Application 与 Classic)之间有一个桥梁(SandboxBridge),如果被恶用,Classic 沙箱就可以拥有 Application沙箱的功能。(关于沙箱请看这里 [AIR]Adobe AIR Beta 2的安全方面的变化)

因此,AIR 1.0 有可能与桌面程序同样危险!但注意,这指的是 AIR 1.0,不是AIR 1.x。

2007-10-20

[AIR]Adobe AIR Beta 2的安全方面的变化

AIR的更新补丁已经公开了(air_b2_badge_100907.zip : 50.5KB)。它是为了解决之前版本的XSS(cross Site Script)攻击漏洞。最好马上更新。 HTML的安全沙箱也发生了变化。为了对付Javascript的eval()、JSON、innerHTML等的攻击,从Beta 2开始,提供了2种安全沙箱。

第一种安全沙箱叫程序沙箱(Application Sandbox)。它能自由地使用AIR的API,但无法使用外部的Script与eval()。

第二种叫经典沙箱(Classic Sandbox)。它提供与HTML浏览器相同的功能,但无法调用AIR的API。

AIR Beta 2的默认沙箱为程序沙箱。所以几乎所有的AJAX框架都无法正常工作。在这种情况,应该先在经典沙箱里写HTML程序。再在使用AIR的API的地方转换为程序沙箱。最后再添加从经典沙箱调用程序沙箱的处理。使用SandboxBridge,可以使两种沙箱共存。

经典沙箱的指定方法、SandboxBridge的API的具体使用方法等可以参照一个简单的例子(air_htmlsecurity_sample_100107.zip : 64.7KB)。并且在AIR Developer Center(en)里有关联的文章(Building an expense tracker on the new Adobe AIR HTML security model)。

2007-10-09

Adobe AIR的电子署名

AIR Beta 2以后,在打包时必须制作电子署名。电子署名的目的为:

  1. 确认包未被修改(比如说被绑定病毒)
  2. 确认包的创建者。

如果未署名,将会生成扩展名为airi的文件,这个如果不用adt等来署名的话,将无法安装到AIR运行环境。

署名可以使用CA发行的或者自己的署名的证明书。用自己的署名的证明书的话无法用于以上的确认包的创建者的目的。

注意,电子署名并不保证程序能够正常运行。并且,因为现在为Beta,所以并不能保证电子署名本身功能的正确性。

自己的署名的证明书的制作

自己的署名的证明书可以用 Flex Builder 3 Beta 2,Flash CS3/Dreamweaver CS3 的 AIR Beta 2用的扩展插件来制作。注意,千万别忘了密码

用Flex Builder 3 Beta 2来制作

执行Export向导,当显示"Digital Signature"的画面时,点"Create..."按钮。再输入署名,密码,生成的文件,点OK。注意在名字里可以使用的只有英数字。

用Flash CS3来制作

选择AIR->Application & Installer Settings打开设置窗口,并且确认 Sign the AIR file with a digital certificate 是选中的。再点击"Digital Signature"右边的 "Change..."按钮。这将会打开设定署名的窗口。以后与Flex Builder相同。(可以选择1024 Bit与2048 Bit)

用Dreamweaver CS3来制作

选择Site->AIR Application Settings...打开设置窗口。再点击"Digital signature"右边的"Set..."。这将会打开设定署名的窗口。以后与Flash CS3相同。

2007-10-03

新的RIA制作工具 - Thermo

Thermo是为了提高RIA的UI设计的工具。

ThermoMain

Thermo的功能如下(预定):

  1. 用Photoshop, Illustrator, Fireworks来设计画面。
  2. 创建的文件可以直接用Thermo来打开,并用它的绘画工具来设计画面。
  3. 对画面设计添加交互功能。
  4. 制定过度与特效。
  5. 设定测试数据来运行与测试。
  6. 输出MXML。

有一种Photoshop, Illustrator, Fireworks为平面设计者,Thermo为交互设计者的工具的感觉。因为可以与FlexBuilder的文件共享,所以RIA的开发效率会大大提高。

Demo的图片等详细参见Adobe Lab(Thermo@Labs

2007-10-02

Spry 1.6 与 AIR Extension for Flash & Dreamweaver CS3

Spry 1.6 Pre-realse 发布了!Spry Framework 是为Ajax开发的轻量级的UI等的库。它可以高校地开发出强壮的Ajax网页。 Spry Framework 的 Dreamweaver CS3 的升级也公开了。(Spry Prerelease 1.6 Download@Labs)变更已经写在上面了,大家可以去看一看。(Spry Change Log@Labs)Log也更新了。(Spry framework for Ajax@Labs

并且AIR Beta 2 的Dreamweaver CS3 与 Flash CS3功能扩展插件也发布了。均支持以下环境

  • Windows XP SP2
  • Windows Vista
  • Mac OS 10.4.x (Intel or PPC)

注意,必须先卸载以前的版本在安装。

2007-10-01

Flex 3 beta 2

Flex 3 Beta 2 在Adobe Lab 发布了。详细参见(Adobe FlexBuilder@Labs, Adobe Flex SDK@Labs

根据Flex 3 Planning的最新信息,Flex 3 的时间表如下:

  • April 9, 2007 M1 Release (Alpha)
  • June 11, 2007 M2 Release (Beta 1)
  • October M3 Release (Beta 2) - Feature Complete
  • Late 2007 M4 - Release Candidate
  • Early 2008 Final Release

本次的内部版本为M3,即第三个测试版本。功能已经完全实装了。在今年内将发布RC版本,即M4。

使用CrossDomain RSL时,必须使用一起发布的Flash Player(9.0.60.235)。这个Flash Player 为Beta版。

Flex Skin Design Extensions

为CS3的产品的Flex 3 Skin制作的导入的功能扩展也发布了。目前的版本为Pre-release。提供了Photoshop, Illustrator, Flash, Fireworks的功能扩展。

下载地址(Flex Skin Design Extensions@Labs Downloads

2007-05-04

Apollo入门 - Apollo网络浏览器(2)追加后退按钮

Apollo入门 - Apollo网络浏览器(1)

追加"Back(后退)"按钮

首先追加一个后退按钮

Code:MXML
<?xml version="1.0" encoding="utf-8"?>
<mx:ApolloApplication xmlns:mx="http://www.adobe.com/2006/mxml">
  <mx:HBox>
    <mx:TextInput id="inputTF" width="225" text="http://"/>
    <mx:Button label="Move" click="html.location = inputTF.text;"/>
    <!--后退按钮-->
    <mx:Button label="Back" click="back()"/>
    </mx:HBox>
  <mx:HTML id="html" width="100%" height="100%"/>
</mx:ApolloApplication>

在追加的按钮的标签里有一个click="back()",这是当按下后退按钮时的回调函数。

下面来写back()函数。在MXML里写Actionscript用Script标签。

mx:HBox的前面添加以下内容:

Code:MXML
<mx:Script>
  <![CDATA[
  // 记录历史的数组
  private var history:Array = new Array();
  private function back():void {
    if (history.length > 1) {
      history.pop(); // 移除现在的URL
      var prevURL:String = history[history.length - 1]; // 得到前一个URL
      html.location = prevURL; // 变更HTML组件
      inputTF.text = prevURL; // 变更输入框
    }
  }
  ]]>
</mx:Script>

接着,在URL变更时在history数组里添加一个新的历史记录。

当HTML组件读取完毕时会触发complete事件。所以在HTML组件的标签加上complete="pushURL(event)"

Code:MXML
<mx:HTML id="html" width="100%" height="100%" complete="pushURL(event)"/>

下面来添加pushURL()函数。

Code:Actionscript
private function pushURL(e:Event):void {
  // 添加新的URL
  history.push(html.location);
  // 变更输入框
  inputTF.text = html.location;
}

以下为全部代码。

Code:MXML
<?xml version="1.0" encoding="utf-8"?>
<mx:ApolloApplication xmlns:mx="http://www.adobe.com/2006/mxml">
  <mx:Script>
    <![CDATA[
    // 记录历史的数组
    private var history:Array = new Array();
    private function back():void {
      if (history.length > 1) {
        history.pop(); // 移除现在的URL
        var prevURL:String = history[history.length - 1]; // 得到前一个URL
        html.location = prevURL; // 变更HTML组件
        inputTF.text = prevURL; // 变更输入框
      }
    }
    private function pushURL(e:Event):void {
      // 添加新的URL
      history.push(html.location);
      // 变更输入框
      inputTF.text = html.location;
    }
    ]]>
  </mx:Script>
  <mx:HBox>
    <mx:TextInput id="inputTF" width="225" text="http://"/>
    <mx:Button label="Move" click="html.location = inputTF.text;"/>
    <!--后退按钮-->
    <mx:Button label="Back" click="back()"/>
    </mx:HBox>
  <mx:HTML id="html" width="100%" height="100%" complete="pushURL(event)"/>
</mx:ApolloApplication>

比如我在文本框里输入了http://www.google.cn,点击Move后,就出现了以下画面。

Apollo入门 - Apollo网络浏览器(1)

我们来做一个Apollo网络浏览器。

1.新建一个Apollo项目。

选择Basic,点Next。

取名为Brower,点Next。

Main Source folder 里写入src,点Next。

  • ID(程序的ID,推存使用类似于com.sample.appName的形式)为sample.Brower。
  • Name(程序的名字)为Brower。
  • Publisher(作者)为你的名字
  • Description(简述)为It is a Apollo Brower。
  • Copyright(版权信息)为2007。

点Finish。

2.在Brower.mxml里写入

Code:MXML
<?xml version="1.0" encoding="utf-8"?>
<mx:ApolloApplication xmlns:mx="http://www.adobe.com/2006/mxml">
  <mx:HBox>
    <mx:TextInput id="inputTF" width="225" text="http://"/>
    <mx:Button label="Move" click="html.location = inputTF.text;"/>
  </mx:HBox>
  <mx:HTML id="html" width="100%" height="100%"/>
</mx:ApolloApplication>

3.按Ctrl+s保存文件,再执行mxml文件。

比如我在文本框里输入了http://www.google.cn,点击Move后,就出现了以下画面。

Apollo的扩展名.air的意思

原文:Aedis.Ju: What about .air mean?

Apollo的文件的扩展名是.air。

它的意思我猜是:

air != atomsphere;

air = ria = RIA = Rich Internet Application!

2007-04-29

Apollo的核心 - Shell类

Shell是连接Apollo程序和OS的对象。根据官方文档,虽然今后很有可能会变更它的方法,但还是把他的核心说一下。

因为Shell对象会在程序启动时自动生成,所以不需要在程序中创建。它是一个单例对象(Singleon),用 Shell.shell 来访问。

Shell类的属性和方法

Shell类的属性列表:

Code:
id:String                 // 程序的ID
activeWindow:NativeWindow // 现在活动的窗口
focusWindow:NativeWindow  // 现在拥有焦点的窗口
autoExit:Boolean          // 如果是true,就在关闭了所有窗口时结束程序

id是程序配置文件(程序名-app.xml)的name标签的值。id是程序的标志符,必须与其他的程序的不一样。所以推荐使用类似于"com.sample.apollo.ApplicationName"的名字。能在id里使用的字符是英数字,"."和"-"。

activeWindow是现在活动的窗口,focusWindow是现在拥有焦点的窗口。如果对象窗口不是属于Shell(不是Apollo打开的窗口)的话,会是 null

autoExit值为 true (默认值)时,就在关闭了所有窗口时结束程序; false 时必须调用Shell.shell.exit()来结束程序。但由于Alpha版的BUG,即时调用exit()也不会结束程序。所以至少在Alpha版里最好不要碰autoExit

注意,在事件里调用exit()时不会马上结束程序,而是在事件处理完了的时候结束。

Shell类的事件

Shell类的事件定义如下:

Code:
activate      // 当程序变为活动时
deactivate    // 当程序变为非活动时
invoke        // 当程序启动时
networkChange // 当网络链接发生变化时

activate是当程序变为活动时,deactivate是当程序变为非活动时触发的事件。Alpha版好像activatedeactivate事件只触发于最初打开的窗口。

Invoke是当程序启动时触发。这个事件会保存直到添加了听诊器(Listener)为止,所以可以在程序启动后处理的。

Inboke事件类型是InvokeEvent。它拥有以下2个属性:

Code:
arguments:Array // 启动时给与的参数列表
currentDirectory:File // 参数里有相对路径的基准路径(绝对路径 = 基准路径 + 相对路径)

注意,Apollo不能同时启动一个程序数次。在第2次程序启动时,会触发第1次启动的程序的Inboke事件。

最后一个networkChange事件当网络链接发生变化时触发。比如网线断开了。

2007-04-27

NativeWindow 类的事件详解2

displayStateChanging 的取消

NativeWindow 类的事件详解1里也提到,ing系的事件是可以取消的。比如取消 displayStateChanging 事件就意味着不变更 displayState,也就是说不进行最大化/最小化。

在AS3里,标准的取消事件方法是调用preventDefault()。如果直接使用上次的例子的话,只需要在onDispStateEvent()里加上preventDefault()。

因为onDispStateEvent()方法是displayStateChange和displayStateChanging两个事件共用了的,所以有可能events是不可取消的displayStateChange事件。所以需要判断是哪一个事件:

Code:Actionscript
private function onDispStateEvent(e:NativeWindowDisplayStateEvent):void {
  if (e.cancelable) { // 检测是否可以取消
    e.preventDefault(); // 取消事件
  }
  trace("type:", e.type, e.afterDisplayState);
}

执行后,就会发现系统窗口的按钮会没反应,但程序里的按钮却照常不误。并且如果在程序里的按钮事件里触发displayStateChanging事件的话,程序里的按钮就与系统窗口的按钮动作一样了。

NativeWindowBoundsEvent

如果NativeWindow的bounds属性被变更,就会触发NativeWindowBoundsEvent。bounds被触发的情况是窗口的大小或位置被改变时。

NativeWindowBoundsEvent拥有beforeBounds和afterBounds属性,分别指变更前和变更后的值。ing系(moving,resizing)事件的beforeBounds为当前值,完成通知(move,resize)事件的afterBounds为当前值。

与NativeWindowDisplayStateEvent一样,move和resize事件会在任何条件下触发,但moving和resizing不会在代码里触发,只会在用鼠标拖动系统窗口等条件下触发。

注意,在Stage类里也有一个resize事件,这是在画面的大小发生改变,重画时触发的。

以下是测试NativeWindowBoundsEvent的例子。

Code:MXML
<?xml version="1.0" encoding="utf-8"?>
<mx:ApolloApplication xmlns:mx="http://www.adobe.com/2006/mxml" applicationComplete="addListeners()">

  <mx:Script>
    <![CDATA[
    private function addListeners():void {
      stage.window.addEventListener( NativeWindowBoundsEvent.RESIZE, onBoundsEvent);
      stage.window.addEventListener( NativeWindowBoundsEvent.RESIZING, onBoundsEvent);
      stage.window.addEventListener( NativeWindowBoundsEvent.MOVE, onBoundsEvent);
      stage.window.addEventListener( NativeWindowBoundsEvent.MOVING, onBoundsEvent);
    }
    private function onBoundsEvent(e:NativeWindowBoundsEvent):void {
      trace("type:", e.type, e.afterBounds);
    }
    private function onBoxMouseDown(e:MouseEvent):void {
      stage.window.startResize( NativeWindowResize.BOTTOM_RIGHT);
    }
    private function onBarMouseDown(e:MouseEvent):void {
      stage.window.startMove();
    }
    ]]>
  </mx:Script>
  <mx:HBox mouseDown="onBarMouseDown(event)" width="100%" height="24" backgroundColor="#ffffff"/>
  <mx:HBox mouseDown="onBoxMouseDown(event)" width="100%" height="100%" backgroundColor="#ffffff"/>
</mx:ApolloApplication>

close与closing事件

这是关闭窗口时触发的事件。事件类型为flash.events.Event。

closing是在关闭前,close是在关闭后触发。如果取消closing事件,窗口将不会被关闭。其余与NativeWindowBoundsEvent的触发方式一样,在这里就不重复了。

(完)

2007-04-22

NativeWindow 类的事件详解1

以下是 NativeWindow 的事件列表:

Code:
displayStateChange //NativeWindow 对象的 displayState 属性被变更后
displayStateChanging //NativeWindow 对象的 displayState 属性被变更前
move //NativeWindow 对象在桌面上移动后
moving //NativeWindow 对象在桌面上移动前
resize //NativeWindow 对象改变大小后
resizing //NativeWindow 对象改变大小前
close //NativeWindow 对象被关闭后
closing //NativeWindow 对象被关闭前

我想一看就明白各2个事件成为一对。定义了对窗口的4种操作的紧接之前和完成后各自的状态的事件。

ing 结束的事件赋予像警告一样的地位,在处理事件完成前,可以确认状况,根据场合的不同取消处理等。为此 ing结束的事件全都是可以取消的。

另一方面,不以ing 结束的事件是通知完成后的事件。需要事后处理的情况使用。

下面稍微详细地查看以下各个事件。

NativeWindowDisplayStateEvent

是首先有关 displayState 属性变更的事件。displayStateChanging 是NativeWindow 对象的 displayState 被变更的紧接之前,而displayStateChange 是根据 displayState 被变更了之后的 NativeWindow 的处理(dispatch)。

这个时候dispatch的事件对象的形式为 flash.events.NativeWindowDisplayStateEvent 。这个对象的事件有着 beforeDisplayState 和 afterDisplayState 的属性,表示各自变更前的值和变更后的值。

因为在displayStateChanging 事件的情况下变更还没完成,在接收了事件的时刻的 displayState 属性的值就是 beforeDisplayState 。但在 displayStateChange 事件的情况下变更已经进行,那个时刻的 displayState 属性的值就是 afterDisplayState 。

下面来写一个例子。首先,确认程序配置文件(程序名-app.xml)的 rootContent 标签的 systemChrome 为 standard 。
Code:XML
<rootContent systemChrome="standard" transparent="false" visible="true">[SWF reference is generated]</rootContent>

下面的例子是在 applicationComplete事件里添加listener (onDispStateEvent)。在onDispStateEvent 里面 trace()输出事件信息,请用debug 方式执行。

Code: MXML
<?xml version="1.0" encoding="utf-8"?>
<mx:ApolloApplication xmlns:mx="http://www.adobe.com/2006/mxml" applicationComplete="addListeners()">
<mx:Script>
<![CDATA[
private function addListeners():void {
stage.window.addEventListener( NativeWindowDisplayStateEvent.DISPLAY_STATE_CHANGE, onDispStateEvent);
stage.window.addEventListener( NativeWindowDisplayStateEvent.DISPLAY_STATE_CHANGING, onDispStateEvent);
}

private function onDispStateEvent(e:NativeWindowDisplayStateEvent):void {
trace("type:", e.type, e.afterDisplayState);
}

private function onMinBtnClick(e:MouseEvent):void {
stage.window.minimize();
}
private function onMaxBtnClick(e:MouseEvent):void {
if (stage.window.displayState != NativeWindowDisplayState.MAXIMIZED) {

stage.window.maximize();
maxBtn.label = "v";
}else{
stage.window.restore();
maxBtn.label = "\u25A2";
}
}
private function onCloseBtnClick(e:MouseEvent):void {

stage.window.close();
}
]]>
</mx:Script>
<mx:HBox width="100%" backgroundColor="#ffffff">
<mx:Button id="minBtn" label="_" click="onMinBtnClick(event)" />
<mx:Button id="maxBtn" label='{"\u25A2"}' click="onMaxBtnClick(event)" />
<mx:Button id="closeBtn" label="X" click="onCloseBtnClick(event)" />
</mx:HBox>
<mx:HBox width="100%" height="100%" backgroundColor="#ffffff"/>
</mx:ApolloApplication>

有人可能会注意到系统chrome的最小化/最大化按钮和窗口内的最小化/最大化按钮的事件有些差异。

由系统chrome的按钮来最大化窗口会触发 displayStateChanging 和 displayStateChange 两个事件。

但如果按了窗口内的按钮来最大化窗口,displayStateChange 事件以外的不会发生。(即 ing 事件不会发生)。

这是因为由系统chrome的按钮来最大化窗口的话,他考虑到处理实际被进行之前的对应 。为此,NativeWindow 自动地做了 displayStateChanging dispatch。

但如果按窗口内的按钮来调用 minimize()等方法,处理实际被进行之前的对应应该是可以的(在minimize()等方法里写)。为此即使调用了 minimize(), maximize(), restore(), displayStateChanging 也不自动dispatch。

如果想在 minimize()等调用后,触发 displayStateChanging 事件的话,也可以追加以下语句:

Code: Actionscript
//以minimize()为例
private function onMinBtnClick(e:MouseEvent):void {
stage.window.minimize();
var dispStateEvent:NativeWindowDisplayStateEvent = new NativeWindowDisplayStateEvent(
NativeWindowDisplayStateEvent.DISPLAY_STATE_CHANGING, true, true,
stage.window.displayState, NativeWindowDisplayState.MINIMIZED);
stage.window.dispatchEvent(dispStateEvent);
}

这样,就与由系统chrome的按钮来最大化窗口是一样的了。把程序配置文件(程序名-app.xml)的 rootContent 标签的 systemChrome 变为 none 就可以看到效果了。

未完待续。

打开新的Apollo窗口的方法

要从Apollo程序打开新的窗口,需要生成NativeWindow或它的子类的实例。下面为NativeWindow的构造函数:

Code:
public function NativeWindow(visible:Boolean, initOptions:NativeWindowInitOptions)

NativeWindow的构造函数有2个参数。

第一个参数是窗口制作的时候是否显示。 制作的窗口在表示位置和大小等有可能会有修改。如果修改时窗口在表示了的状态下进行的话这些的处理的途中的阶段也会在画面上表示了。所以最好是首先将visible = false (不显示),必要的修改结束了再 让 visible = true 来显示窗口。

同样,如果不想在Apollo程序启动的时候 显示画面,可以把 程序配置文件(程序-app.xml)里的rootContent标签的visible改为false。再在修改完后再 让 visible = true 来显示窗口。

第二个参数是指定窗口初始化所使用的选项的 NativeWindowInitOptions。NativeWindowInitOptions的定义为:

Code:
systemChrome:String // 窗口使用的系统chrome的种类
transparent:Boolean // 窗口是否能够透明
resizable:Boolean // 是否能改变窗口的大小
maximizable:Boolean // 是否能最大化能窗口
minimizable:Boolean // 是否能最小化能窗口

各自的属性的初始值如下。

Code:
systemChrome = NativeWindowSystemChrome.STANDARD;
transparent = false;
resizable = true;
maximizable = true;
minimizable = true;

systemChrome 能采用的值是在 NativeWindowSystemChrome里定义的。现在的Alpha版只能使用以下的 2种。

Code:
public static const STANDARD:String // 使用标准OS的Chrome
public static const NONE:String // 不使用标准OS的Chrome

如果把NativeWindowSystemChrome.指定为NONE,就没有chrome,也就是说只表示框框内侧的窗口。

以下为打开新的Apollo窗口函数的例子。
Code:Actionscript
public function createNewWindow():void {
// 作成窗口初始化选项
var options:NativeWindowInitOptions = new NativeWindowInitOptions();
// 在这里按照必要设定选项

// 窗口的作成
var newWindow:NativeWindow = new NativeWindow(false,options);

// 在这里对窗口进行必要的处理

// 让窗口显示
newWindow.visible = true;
}

owner 属性

NativeWindowInitOptions 里有一个 owner 的属性。能指定新的Apollo窗口的所有者(父窗口)。

如果新窗口指定了owner的话,新窗口一定会在自己的 owner 上面显示(会遮住)。即使焦点在owner 窗口上,彼此的重叠顺序也不会变化。

同时,owner 窗口在关闭时,在 owner 里(上)的那个新窗口也全部会关闭。

下的例子是:最初启动的窗口为程序启动后有的窗口的 owner 。所以,关闭最初启动的窗口的话几个开着的窗口也全部会关闭,程序也会结束。

Code:MXML
<?xml version="1.0" encoding="utf-8"?>
<mx:ApolloApplication xmlns:mx="http://www.adobe.com/2006/mxml" width="350" height="200">
<mx:Script>

<![CDATA[
public function createNewWindow():void {
// 作成窗口初始化选项
var options:NativeWindowInitOptions = new NativeWindowInitOptions();
options.owner = stage.window;

// 作成窗口
var newWindow:NativeWindow = new NativeWindow(false,options);
newWindow.width = 400;
newWindow.height = 300;

// 在窗口里追加text field
newWindow.stage.align = StageAlign.TOP_LEFT;
newWindow.stage.scaleMode = StageScaleMode.NO_SCALE;
var tf:TextField = new TextField();
tf.width = newWindow.width;
tf.text = "这是空窗口";
newWindow.stage.addChild(tf);

// 让窗口显示
newWindow.visible = true;
}
]]>
</mx:Script>
<mx:Button label="打开窗口" click="createNewWindow();"/>
</mx:ApolloApplication>

注意,作为Alpha版的限制 ,Flex的组件不能添加。这个例子使用的是text field。

2007-04-05

Apollo窗口的设置

消除OS窗口框架

首先,变更程序配置文件(程序名-app.xml) 里 rootContent 标签。

rootContent 标签的 systemChrome 为 "standard" 时,为 OS 标准的窗口;"none"时,为 Apollo 程序提供的窗口框架。

<rootcontent systemchrome="none" transparent="false" visible="true">[SWF reference is generated]</rootcontent>

按照上面,把 systemChrome 设为 "none",制作一个空的Apollo程序。

<?xml version="1.0" encoding="utf-8"?> <mx:ApolloApplication mx="http://www.adobe.com/2006/mxml"> </mx:ApolloApplication>

执行后,应该会表示以下画面:

Apollo Application Sample

不想使用Apollo 提供的窗口框架时,把 Apollo 程序(程序名.mxml)的根节点从ApolloApplication变为Application。

<?xml version="1.0" encoding="utf-8"?> <mx:Application mx="http://www.adobe.com/2006/mxml"> </mx:Application>

执行后,应该会表示以下画面:

Apollo Application Sample

去掉背景

接着,去掉四方的背景。

首先,在序配置文件(程序名-app.xml)内的 rootContent 标签里有一个 transparent 的属性。把它设为true。

<rootContent systemChrome="none" transparent="true" visible="true">[SWF reference is generated]</rootContent>

只有这些,背景还不会变。还要设置Application的CSS属性:

background-color:""; background-image:"";

这样的话,程序的背景就变为透明的了。

也就意味着执行的程序什么也看不到。

以下为全部代码:

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml">
<mx:Style>
Application {
 background-color:"";
 background-image:"";
}
</mx:Style>
<!--一张图片-->
<mx:Image source="myImage.png"/>

</mx:Application>