
高级技术文档撰写工程师
Adobe
本范例应用程序可读写与其位置和大小相关的数据以及保存日期。另外, 还会在应用程序打开时, 根据这些数据确定窗口位置。具体而言, 本范例应用程序将演示 Adobe AIR 的以下功能:

图 1。通过本范例应用程序可以指定 XML 首选参数。
注意: 本范例应用程序按原样提供, 用于教学目的。
若要充分利用本篇文章, 您需要以下软件和文件:
本范例应用程序包括以下文件:
应具备构建 HTML 应用程序的一般经验。有关使用此快速入门指南的详细信息, 请参阅用 HTML 构建快速入门范例应用程序。
本应用程序可读写与其位置和大小相关的数据以及保存日期。另外, 还会在应用程序打开时, 根据这些数据确定窗口位置。首选参数保存在包含 XML 数据的文本文件中。应用程序在读取时将这些数据转换为 XML 对象, 在写入时将 XML 数据转换为文本。若要测试此应用程序, 请按照以下步骤操作:
本部分将不一一介绍文件中的全部 HTML 标记, 而仅介绍专门针对 AIR 的 JavaScript 代码。
init() 方法初始化 prefsFile File 对象, 将其指向预定义的路径, 然后调用 readXML() 方法, 该方法读取数据:
prefsFile = air.File.applicationStorageDirectory;
prefsFile = prefsFile.resolvePath("preferences.xml");
readXML();
File.applicationStorageDirectory 指向 AIR 应用程序的存储目录, 该目录的定义对于每个 AIR 应用程序都是独一无二的。
init() 方法还设置事件处理函数, 用于响应窗口的关闭 (此时将首选参数数据保存至文件):
window.nativeWindow.addEventListener(Event.CLOSING, windowClosingHandler);
readXML() 方法设置 File 对象和 FileStream 对象。调用 open() 方法时将 fileMode 参数设置为 FileMode.READ, 这样 FileStream 对象就可以从文件中读取数据 (如果文件存在)。
stream = new air.FileStream();
if (prefsFile.exists) {
stream.open(prefsFile, air.FileMode.READ);
processXMLData();
}
stream 对象的 open() 方法同步打开文件, 并开始将数据读入读取缓冲区。
processXMLData() 方法处理 XML 数据, 然后关闭文件。FileStream 对象的 bytesAvailable 属性是读取缓冲区中的字节数, 即 (从同步读取文件开始) 来自文件的所有字节:
prefsXML = stream.readUTFBytes(stream.bytesAvailable); stream.close();
processXMLData() 函数使用 JavaScript DOM API 处理 XML 数据, 然后关闭文件。FileStream 对象的 bytesAvailable 属性是读取缓冲区中的字节数, 即 (从同步读取文件开始) 来自文件的所有字节:
var domParser = new DOMParser();
prefsXML = domParser.parseFromString(prefsXML, "text/xml");
var windowState = prefsXML.getElementsByTagName("windowState")[0];
window.moveTo(windowState.getAttribute("x"), windowState.getAttribute("y"));
document.getElementById("xPositionField").value = windowState.getAttribute("x");
document.getElementById("yPositionField").value = windowState.getAttribute("y");
window.resizeTo(windowState.getAttribute("width"), windowState.getAttribute("height"));
document.getElementById("widthField").value = windowState.getAttribute("width");
document.getElementById("heightField").value = windowState.getAttribute("height");
document.getElementById("dateField").value =
prefsXML.getElementsByTagName("saveDate")[0].firstChild.nodeValue;
application.xml 文件定义应用程序的属性, 其中将 initialWindow 属性的 visible 属性设置为 false。使窗口可见之前调整窗口大小并将其重新定位。
readXML() 方法在 processXMLData() 方法返回之后使窗口可见:
window.nativeWindow.visible = true;
createXMLData() 函数将 XML 数据转换为字符串, 向字符串的开头添加 XML 声明, 并将每行结尾字符替换为特定于平台的每行结尾字符 (由 File.lineEnding 常量表示):
var cr = air.File.lineEnding;
prefsXML = "<?xml version='1.0' encoding='utf-8'?>" + cr
+ "<preferences>" + cr
+ " <windowState" + cr
+ " width = '" + window.outerWidth.toString() + "'" + cr
+ " height = '" + window.outerHeight.toString() + "'" + cr
+ " x = '" + window.screenLeft.toString() + "'" + cr
+ " y = '" + window.screenTop.toString() + "'" + "/>" + cr
+ " <saveDate>"
+ new Date().toString()
+ "</saveDate>" + cr
+ "</preferences>";
document.getElementById("widthField").value = window.outerWidth.toString();
document.getElementById("heightField").value = window.outerWidth.toString();
document.getElementById("xPositionField").value = window.screenLeft.toString();
document.getElementById("yPositionField").value = window.screenTop.toString();
writeXMLData() 函数设置 FileStream 对象, 并使用该对象写入数据。注意, 在 open() 方法中指定 FileMode.WRITE 作为 fileMode 参数。这指定 FileStream 对象可以写入文件 (并在写入之前截断任何现有数据):
stream = new air.FileStream(); stream.open(prefsFile, air.FileMode.WRITE);
接下来, 调用 writeUTFBytes() 方法, 该方法 (以 UTF-8 数据的形式) 将 XML 数据的字符串版本写入文件:
stream.writeUTFBytes(prefsXML); stream.close();
用户关闭窗口时, NativeWindow 对象将调度 closing 事件。此事件的处理函数取消了对此事件的默认行为 (即关闭应用程序), 并调用 saveData() 方法, 该方法将保存 XML 数据。保存数据之后, 代码调用 NativeApplication.nativeApplication.exit() 方法, 从而关闭应用程序:
function windowClosingHandler(event)
{
event.preventDefault();
nativeWindow.removeEventListener("closing", windowClosingHandler)
saveData();
air.NativeApplication.nativeApplication.exit();
}