- 浏览: 200648 次
- 性别:
- 来自: 苏州
文章分类
最新评论
23.3 升级AIR应用程序
AIR桌面应用程序可导出为air文件。双击此文件就能开始安装应用程序。若系统中已安装旧版的AIR应用程序,双击air文件时会提示更新AIR应用程序。这种方式是非程序性的方式。Flex 3.0中新增Update类,用以升级AIR应用程序。本小节将介绍使用Flex 3.0实现AIR应用程序的升级。
23.3.1 升级前的准备
升级前需要做些准备,包括导出最新版本的AIR应用程序和定义版本信息的文件。
1.导出AIR应用程序
导出的AIR应用程序得到的是一个安装包(.air格式),可双击打开并安装。导出AIR应用程序的步骤如下所示。
单击“File”|“Export…”命令,弹出导出类型对话框,如图23-4所示。
在树型号列表中选择“Adobe AIR”|“Adobe AIR Package”选项,单击“Next”按钮,弹出“设置AIR安装包”对话框,如图23-5所示。
图23-4 导出类型对话框 图23-5 设置AIR安装包对话框
在“Project”文本框中输入导出的工程名。在“Application”文本框中输入工程的启动页(MXML文件)。在“Include files”区域选择要导出的文件。在“Save as”文本框中输入导出的路径。单击“Finish”按钮,完成AIR应用程序的导出。
2.定义版本信息文件
用户可将当前AIR应用程序的版本信息手动存储于TXT文件中,用以判断AIR应用程序是否需要升级。
23.3.2 检查版本信息
用户可使用FileStream类加载版本信息文件,从而获得当前AIR应用程序的版本号。若当前的版本号小于最新的版本号,说明AIR应用程序需要更新。以下代码使用FileStream类加载“version.txt”文件,并判断是否需要更新AIR应用程序。
var theNewestVersion:Number=5; //定义最新的版本号
…
private function checkVersion():void //检查版本号信息
{
/*读取版本号*/
var stream:FileStream = new FileStream();
stream.open(new File("version.txt"), FileMode.READ);
var currVersion:String = stream.readUTFBytes(stream.bytesAvailable);
stream.close();
//若当前版本号小于最新版本号,需要下载最新的air文件
if (currVersion<theNewestVersion)
{
//升级AIR程序
}
}
23.3.3 使用FileStream类下载最新版本
在更新AIR应用程序前,需要下载最新版本的AIR安装包。使用FileStream类可下载任何格式的文件。其语法如下所示。
var FileStream变量:FileStream=new FileStream();
FileStream变量.open(下载文件路径,FileMode.WRITE);
FileStream变量.writeBytes(ByteArray变量,0,ByteArray变量.length);
ByteArray类型用以存储二进制的数据集。其length属性记录了ByteArray变量的长度。以下代码使用FileStream类下载最新版本安装包“p1.air”。
public var fileData:ByteArray = new ByteArray();
…
private function writeAirFile():void //下载air文件处理函数
{
var file1:File = File.desktopDirectory.resolve("p1.air");//下载路径为桌面
var fileStream:FileStream = new FileStream();
fileStream.openAsync(file1, FileMode.WRITE);
fileStream.writeBytes(fileData, 0, fileData.length);//开始写文件
fileStream.close();
}
23.3.4 使用Updater类升级AIR应用程序
在下载完成最新版本的AIR安装包后,可使用Updater类的update方法升级应用程序。其语法如下所示。
Updater变量.update(AIR路径,版本字符串);
版本字符串可自定义,如“1.2”,“1.3”等。以下代码使用Update类将应用程序升级至最新版本。
var ud:Updater=new Updater();
ud.update(new File("newest.air"),"1.3");
23.3.5 升级AIR应用程序实例
本实例中假设最新导出的AIR安装包为1.3版本,并放置于工程“bin”文件夹下。
升级AIR应用程序实例的步骤如下所示。
新建AIR工程。
在“bin”文件夹下的“Preferences”文件夹下创建“version.txt”文件。“version.txt”文件中存储当前应用程序的版本号,如“1.2”(小于最新版本号)。
编写检查版本号函数checkVersion。checkVersion函数的主要功能是读取“version.txt”中的版本号。判断是否需要升级AIR程序。以下代码定义了checkVersion函数。
private function checkVersion():void //检查版本号信息
{
/*读取版本号*/
var stream:FileStream = new FileStream();
stream.open(file, FileMode.READ); //file变量指向“version.txt”
var prevVersion:String = stream.readUTFBytes(stream.bytesAvailable);
stream.close();
//记录的版本小于当前最新版本号时,需要下载最新的air文件
if (prevVersion < currentVersion)
{
urlStream.addEventListener(Event.COMPLETE, loaded); //添加对加载完成的监听
urlStream.load(urlReq); //加载air文件
}
}
编写下载最新版本函数loaded。loaded函数使用FileStream类获得AIR应用程序的二进制数据,并将二进制数据写入到本地的AIR文件中。以下代码定义了loaded函数和writeAirFile函数。
private function loaded(event:Event):void //加载完成后,下载air文件
{
urlStream.readBytes(fileData, 0, urlStream.bytesAvailable); //数据读取到fileData数组中
writeAirFile(); //下载air文件
}
private function writeAirFile():void //写入新的air文件
{
var file1:File = File.desktopDirectory.resolve("p1.air"); //路径为桌面
var fileStream:FileStream = new FileStream();
fileStream.addEventListener(Event.CLOSE, fileClosed); //添加写文件完成的监听
fileStream.openAsync(file1, FileMode.WRITE);
fileStream.writeBytes(fileData, 0, fileData.length); //开始写文件
fileStream.close();
}
编写更新AIR应用程序代码。将最新版本AIR应用程序写入本地路径后,使用update方法更新原程序,同时修改“version.txt”文件。以下代码更新AIR应用程序,并修改“version.txt”文件内的版本号。
private function fileClosed(event:Event):void //下载文件完成处理函数
{
Alert.show("下载文件完成");
/*升级版本*/
var updater:Updater = new Updater();
var airFile:File = File.desktopDirectory.resolve("p1.air");
var version:String = currentVersion;
updater.update(airFile, version); //开始升级版本
saveFile(); //存储当前版本信息
}
private function saveFile():void //存储最新版本号
{
var stream:FileStream = new FileStream();
stream.open(file, FileMode.WRITE); //file变量指向“version.txt”
stream.writeUTFBytes(currentVersion);
stream.close();
}
完成剩余代码。剩余代码包括程序初始化函数、变量定义、类的引用等。
以下代码是完整的应用程序代码。
<?xml version="1.0" encoding="utf-8"?>
<mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml"
layout="absolute"
applicationComplete="init()">
<mx:Script>
<![CDATA[
import flash.filesystem.*; //引用flash.filesystem下的类
import mx.controls.Alert; //引用Alert类
public var file:File; //定义File实例
[Bindable]
public var currentVersion:String = "1.3"; //定义最新版本号
public var urlString:String ="p1.air"; //最新版本air的路径
//定义URLRequest实例
public var urlReq:URLRequest = new URLRequest(urlString);
public var urlStream:URLStream = new URLStream(); //定义URLStream实例
public var fileData:ByteArray = new ByteArray(); //定义ByteArray实例
public function init():void //应用程序初始化处理函数
{
//“version.txt”存储版本信息
file = File.applicationResourceDirectory.resolve ("Preferences /version.txt");
if(file.exists) //若文件存在时,检查版本号
{
checkVersion();
}
else //若文件不存在时,创建文件
{
firstRun();
}
}
private function checkVersion():void //检查版本号信息
{
/*读取版本号*/
var stream:FileStream = new FileStream();
stream.open(file, FileMode.READ);
var prevVersion:String = stream.readUTFBytes(stream. bytes Available);
stream.close();
//记录的版本小于当前最新版本号时,需要下载最新的air文件
if (prevVersion < currentVersion)
{
//添加对加载完成的监听
urlStream.addEventListener(Event.COMPLETE, loaded);
urlStream.load(urlReq); //加载air文件
}
}
private function firstRun():void
{
saveFile(); //存储当前版本号
}
private function saveFile():void //存储当前版本处理函数
{
var stream:FileStream = new FileStream();
stream.open(file, FileMode.WRITE);
stream.writeUTFBytes(currentVersion);
stream.close();
}
private function loaded(event:Event):void //加载完成后,下载air文件
{
//数据读取到fileData数组中
urlStream.readBytes(fileData, 0, urlStream.bytesAvailable);
writeAirFile(); //下载air文件
}
private function writeAirFile():void //下载air文件处理函数
{
//下载路径为桌面
var file1:File = File.desktopDirectory.resolve("p1.air");
var fileStream:FileStream = new FileStream();
//添加写文件完成的监听
fileStream.addEventListener(Event.CLOSE, fileClosed);
fileStream.openAsync(file1, FileMode.WRITE);
fileStream.writeBytes(fileData, 0, fileData.length); //开始写文件
fileStream.close();
}
private function fileClosed(event:Event):void //下载文件完成处理函数
{
Alert.show("下载文件完成");
/*升级版本*/
var updater:Updater = new Updater();
var airFile:File = File.desktopDirectory.resolve("p1.air");
var version:String = currentVersion;
updater.update(airFile, version); //开始升级版本
saveFile(); //存储当前版本信息
}
]]>
</mx:Script>
<mx:Label fontSize="35" text="版本{currentVersion}" horizontalCenter="0" verticalCenter="0"/>
</mx:WindowedApplication>
按下Ctrl+F11键,编译运行程序。运行效果如图23-6所示。
图23-7 升级AIR应用程序实例的运行效果
23.4 Flex 3.0中使用Ajax技术
在前面章节里曾介绍过Flex 3.0中如何使用其他Web开发技术,但未涉及Ajax技术。Ajax技术是一种非常流行的Web开发技术,其主要特点是无刷新性。本章将介绍Ajax技术的基础知识及如何在Flex 3.0中使用Ajax技术。
23.4.1 Ajax技术简介
Ajax是“Asynchronous JavaScript and XML”(异步JavaScript和XML)的简称。Ajax技术是一组技术的结合。Ajax利用通信技术(以SOAP和XML为代表)向服务器发送和接收异步请求和响应,然后使用JavaScript、DOM、HTML、CSS技术来处理响应。
Ajax技术通过JavaScript语言调用服务器端的方法,而不需要刷新浏览器,从而减轻了服务器端的负担,也更快捷地响应用户交互。另外,Ajax不需要任何浏览器插件,但浏览器需要允许运行JavaScript。
Ajax技术具体包括如下五种技术:
(47) 使用XHTML+CSS的表示样式。
(48) 使用DOM(Document Object Model)进行动态显示及交互。
(49) 使用XML和XSLT进行数据交换及相关操作。
(50) 使用XMLHttpRequest类进行异步数据查询、检索。
(51) 使用JavaScript整合所有技术。
使用Ajax开发Web应用程序最关键的技术是JavaScript语言和XMLHttpRequest类。本书中不展开详解Ajax技术开发,着重介绍如何在Flex 3.0中调用Ajax技术。
23.4.2 使用<mx:HTML>组件调用Ajax技术
在Flex 3.0中使用<mx:HTML>组件可加载包含Ajax技术的网页,其语法如下所示。
<mx:HTML id="HTML组件id"… location="网页路径"/>
以下代码使用<mx:HTML>组件加载了“www.google.cn”网页。
<mx:HTML id="html" location="www.google.cn"/>
<mx:HTML>组件在加载网页时,加载网页中的全部内容,包括JavaScript(JavaScript是Ajax技术实现的关键)。Flex 3.0中调用JavaScript函数的语法如下所示。
HTML组件id.htmlControl.window.javascript函数(参数列表);
以下代码在单击“OK”按钮时,调用“test.html”网页中的javascript函数init。
<mx:HTML id="html" location="test.html"/>
<mx:Button label="OK" click="html.htmlControl.window.init();"/>
23.4.3 Flex应用程序结合Ajax技术实例
Ajax技术已广泛应用于互联网的开发。许多无刷新的网页或有动态效果网页都使用了Ajax技术。其中,应用Ajax技术最成功的例子是Google的地图搜索。本小节中将调用Google公司免费提供的包含Ajax技术的测试网页来实现地图搜索功能。Flex 3.0结合Ajax技术实例的步骤如下所示。
新建AIR工程。
编写“yahoo.html”文件。
“yahoo.html”文件是HTML网页,包含了自定义的javascript函数来完成地图搜索功能。以下代码是“yahoo.html”文件的源代码。
<!DOCTYPEhtml
PUBLIC"-//W3C//DTDXHTML1.0Strict//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<script src="http://api.maps.yahoo.com/ajaxymap?v=3.4&appid=mapsnap0" type="text/javascript"/>
<script type="text/javascript">
var Imap; //定义变量Imap
function init()//初始化函数
{
Imap = new YMap(document.getElementById('map')); //使用YMap类初始化Imap变量
Imap.addTypeControl(); //添加类型面板
Imap.addPanControl(); //添加方向面板
Imap.addZoomLong(); //添加缩放长条
Imap.addZoomShort(); //添加缩入短条
//绘制地图
Imap.drawZoomAndCenter('601 Townsend St. San Francisco, CA 94103', 5);
}
function lookupAddress(address) //搜索地址函数
{
//根据地址绘制地图
YEvent.Capture(Imap,
EventsList.onEndGeoCode,
function (result)
{
if (!result.success)
{
alert('This address could not be geo-coded.');
return;
}
Imap.drawZoomAndCenter(result.GeoPoint, 2);
});
Imap.geoCodeAddress(address);
}
window.onload =init; //在网页加载时调用init函数
</script>
</head>
<body>
<div id="map"/>
</body>
</html>
(52) javascript代码定义于<head>标签下的<script>标签下。
(53) “<scriptsrc="http://api.maps.yahoo.com/ajaxymap?v=3.4&appid=mapsnap0" type="text/ javascript"/>”表示引用该地址下的javascript类文件。程序中出现的YMap和YEvent类均在此类文件中定义,但对用户不可见。用户可查看Google Maps官方的使用说明。
(54) HTML网页不会自动执行javascript函数。“window.onload=init;”表示在网页加载时调用init函数。
编写Flex应用程序的外观模型。Flex应用程序的外观模型包括<mx:HTML>组件、输入框组件、按钮组件等。以下代码是外观模型的MXML代码。
<mx:VBox paddingTop="0" paddingLeft="0" width="100%" height="100%">
<mx:HBox width="100%">
<mx:Label text="位置:" color="#ffffff" width="5%"/>
<mx:TextInput width="55%" id="address"/>
<mx:Button label="加载中..." enabled="false" id="mapButton" width="10%"/>
<mx:Button label="保存" width="10%"/>
<mx:Button label="复制" width="10%"/>
</mx:HBox>
<mx:HTML id="map" width="800" height="600"/><!--HTML组件,用以加载网页-->
</mx:VBox>
外观模型效果如图23-8所示。
图23-8 Flex结合Ajax实例的外观效果
添加搜索地图的ActionScript 3.0代码。ActionScript 3.0代码中调用“yahoo.html”文件中的lookupAddress函数来完成搜索功能。实例中有两处需要添加搜索地图的ActionScript 3.0代码:输入框组件的enter事件和“开始搜索”按钮的click事件。enter事件在用户输入数据并按下回车键时触发。以下代码是添加处理后的输入框组件和按钮组件。
<mx:TextInput width="55%" id="address" enter="map.htmlControl.window. lookup Address(address.text);"/>
<mx:Button label="加载中..." enabled="false" id="mapButton" width="10%" click="map.htmlControl.window.lookupAddress(address.text);"/>
按钮mapButton用以搜索地图。先是显示“加载中…”,在网页加载完成后显示“开始搜索”。
编写函数takeSnapshot。takeSnapshot函数用以截图并保存图片。以下代码定义了takeSnapshot函数。
private function takeSnapshot():void //保存图片处理函数
{
var home:File = File.desktopDirectory.resolve("map.png"); //设置保存路径
//添加对选择路径事件的监听,并定义其处理代码
home.addEventListener(Event.SELECT,
function (e:Event):void
{
var img:ByteArray = getImage(); //获得图片资源
/*使用FileStream类保存图片*/
var stream:FileStream = new FileStream();
stream.openAsync(File(e.target), FileMode.WRITE);
stream.addEventListener(Event.CLOSE,
function(ee:Event):void
{
Alert.show("图片保存成功!", "提示", Alert.OK);
});
stream.writeBytes(img);
stream.close();
});
home.browseForSave("图片保存路径?"); //打开选择路径窗口
}
private function getImage():ByteArray //获得图片资源
{
var bd:BitmapData = getBitmapData(map.width, map.height); //获得图片数据
var pnge:PNGEncoder=new PNGEncoder(); //定义PNGEncoder类型变量
var img:ByteArray = pnge.encode(bd); //对图片数据进行编码
return img;
}
private function getBitmapData(width:uint, height:uint):BitmapData //获得图片数据
{
var bd:BitmapData = new BitmapData(width, height);
bd.draw(map);
return bd;
}
(55) “bd.draw(map);”语句表示对<mx:HTML>组件截图。
(56) addEventListenner方法的第二个参数一般为处理函数名,但也可直接定义处理代码,此时不需要函数名。
编写函数copyToClipboard。copyToClipboard函数用于将截图复制到剪切板中。以下代码定义了copyToClipboard函数。
private function copyToClipboard():void //复制图片资源至剪切板
{
var mapFile:File = getMapFile(); //获得图片文件
//复制至剪切板
ClipboardManager.accessClipboard()
function ():void
{
var td:TransferableData = new TransferableData(); //定义TransferableData类型变量
//数据处理
td.addData([mapFile], TransferableFormats.FILE_LIST_FORMAT);
ClipboardManager.data = td; //复制至剪切板
Alert.show("图片已复制至剪切板!", "提示", Alert.OK); //提示复制成功
});
}
ClipboardManager类中的accessClipboard方法用以传递数据至剪切板。
完成剩余代码。剩余代码包括初始化处理函数、变量定义、类的引用等。
以下代码是完整的应用程序代码。
<?xml version="1.0" encoding="utf-8"?>
<mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml"
title="结合Ajax实例"
creationComplete="init();"
width="805" maxWidth="805" height="675"
fontSize="13"
maxHeight="675" paddingTop="2"
paddingLeft="2" verticalScrollPolicy="off"
horizontalScrollPolicy="off"
showStatusBar="false">
<mx:Script>
<![CDATA[
import flash.filesystem.*; //引用"flash.filesystem"下的全部类
import mx.controls.Alert; //引用Alert类
import flash.desktop.*; //引用"flash.desktop"下的全部类
import mx.graphics.codec.PNGEncoder; //引用PNGEncoder类
private const WIN_WIDTH:uint = 820; //定义宽度
private const WIN_HEIGHT:uint = 670; //定义高度
private function init():void //应用程序初始化处理函数
{
//HTML组件map加载完成时的处理代码
map.addEventListener(Event.COMPLETE,
function():void
{
mapButton.label = "开始搜索";
mapButton.enabled = true;
});
map.location = "app-resource:/yahoo.html"; //HTML组件map的URL地址
window.visible = true;
}
private function takeSnapshot():void //保存图片处理函数
{
//设置保存路径
var home:File = File.desktopDirectory.resolve("map.png");
//添加对选择路径事件的监听,并定义其处理代码
home.addEventListener(Event.SELECT,
function (e:Event):void
{
var img:ByteArray = getImage(); //获得图片资源
/*使用FileStream类保存图片*/
var stream:FileStream = new FileStream();
stream.openAsync(File(e.target), FileMode.WRITE);
stream.addEventListener(Event.CLOSE,
function(ee:Event):void
{
Alert.show("图片保存成功!", "提示", Alert.OK);
});
stream.writeBytes(img);
stream.close();
});
home.browseForSave("图片保存路径?"); //打开选择路径窗口
}
private function copyToClipboard():void //复制图片资源至剪切板
{
var mapFile:File = getMapFile(); //获得图片文件
//复制至剪切板
ClipboardManager.accessClipboard(
function ():void
{
//定义TransferableData类型变量
var td:TransferableData = new TransferableData();
//数据处理
td.addData([mapFile], TransferableFormats.FILE_ LIST_FORMAT);
ClipboardManager.data = td; //复制至剪切板
//提示复制成功
Alert.show("图片已复制至剪切板!", "提示", Alert.OK);
});
}
private function getImage():ByteArray //获得图片资源
{
//获得图片数据
var bd:BitmapData = getBitmapData(map.width, map.height);
var pnge:PNGEncoder=new PNGEncoder(); //定义PNGEncoder类型变量
var img:ByteArray = pnge.encode(bd); //对图片数据进行编码
return img;
}
//获得图片数据
private function getBitmapData(width:uint, height:uint):BitmapData
{
var bd:BitmapData = new BitmapData(width, height);
bd.draw(map);
return bd;
}
private function getMapFile():File //获得图片文件
{
//创建"map.png"文件
var mapFile:File = File.createTempDirectory().resolve("map.png");
var img:ByteArray = getImage(); //获得图片数据
//将图片数据写入到"map.png"文件中
var stream:FileStream = new FileStream();
stream.open(mapFile, FileMode.WRITE);
stream.writeBytes(img);
stream.close();
return mapFile;
}
]]>
</mx:Script>
<mx:VBox paddingTop="0" paddingLeft="0" width="100%" height="100%">
<mx:HBox width="100%">
<mx:Label text="位置:" color="#ffffff" width="5%"/>
<mx:TextInputwidth="55%"id="address" enter="map.htmlControl.window.lookupAddress(address.text);"/>
<mx:Buttonlabel="加载中..."enabled="false"id="mapButton" width="10%" click="map.htmlControl.window.lookupAddress(address.text);"/>
<mx:Button label="保存" width="10%" click="takeSnapshot();"/>
<mx:Button label="拷贝" width="10%" click="copyToClipboard();"/>
</mx:HBox>
<mx:HTML id="map" width="800" height="600"/> <!--HTML组件,用以加载网页-->
</mx:VBox>
</mx:WindowedApplication>
按下Ctrl+F11快捷键,编译运行程序。运行效果如图23-9所示。
图23-9 Flex结合Ajax实例的运行效果
AIR桌面应用程序可导出为air文件。双击此文件就能开始安装应用程序。若系统中已安装旧版的AIR应用程序,双击air文件时会提示更新AIR应用程序。这种方式是非程序性的方式。Flex 3.0中新增Update类,用以升级AIR应用程序。本小节将介绍使用Flex 3.0实现AIR应用程序的升级。
23.3.1 升级前的准备
升级前需要做些准备,包括导出最新版本的AIR应用程序和定义版本信息的文件。
1.导出AIR应用程序
导出的AIR应用程序得到的是一个安装包(.air格式),可双击打开并安装。导出AIR应用程序的步骤如下所示。
单击“File”|“Export…”命令,弹出导出类型对话框,如图23-4所示。
在树型号列表中选择“Adobe AIR”|“Adobe AIR Package”选项,单击“Next”按钮,弹出“设置AIR安装包”对话框,如图23-5所示。
图23-4 导出类型对话框 图23-5 设置AIR安装包对话框
在“Project”文本框中输入导出的工程名。在“Application”文本框中输入工程的启动页(MXML文件)。在“Include files”区域选择要导出的文件。在“Save as”文本框中输入导出的路径。单击“Finish”按钮,完成AIR应用程序的导出。
2.定义版本信息文件
用户可将当前AIR应用程序的版本信息手动存储于TXT文件中,用以判断AIR应用程序是否需要升级。
23.3.2 检查版本信息
用户可使用FileStream类加载版本信息文件,从而获得当前AIR应用程序的版本号。若当前的版本号小于最新的版本号,说明AIR应用程序需要更新。以下代码使用FileStream类加载“version.txt”文件,并判断是否需要更新AIR应用程序。
var theNewestVersion:Number=5; //定义最新的版本号
…
private function checkVersion():void //检查版本号信息
{
/*读取版本号*/
var stream:FileStream = new FileStream();
stream.open(new File("version.txt"), FileMode.READ);
var currVersion:String = stream.readUTFBytes(stream.bytesAvailable);
stream.close();
//若当前版本号小于最新版本号,需要下载最新的air文件
if (currVersion<theNewestVersion)
{
//升级AIR程序
}
}
23.3.3 使用FileStream类下载最新版本
在更新AIR应用程序前,需要下载最新版本的AIR安装包。使用FileStream类可下载任何格式的文件。其语法如下所示。
var FileStream变量:FileStream=new FileStream();
FileStream变量.open(下载文件路径,FileMode.WRITE);
FileStream变量.writeBytes(ByteArray变量,0,ByteArray变量.length);
ByteArray类型用以存储二进制的数据集。其length属性记录了ByteArray变量的长度。以下代码使用FileStream类下载最新版本安装包“p1.air”。
public var fileData:ByteArray = new ByteArray();
…
private function writeAirFile():void //下载air文件处理函数
{
var file1:File = File.desktopDirectory.resolve("p1.air");//下载路径为桌面
var fileStream:FileStream = new FileStream();
fileStream.openAsync(file1, FileMode.WRITE);
fileStream.writeBytes(fileData, 0, fileData.length);//开始写文件
fileStream.close();
}
23.3.4 使用Updater类升级AIR应用程序
在下载完成最新版本的AIR安装包后,可使用Updater类的update方法升级应用程序。其语法如下所示。
Updater变量.update(AIR路径,版本字符串);
版本字符串可自定义,如“1.2”,“1.3”等。以下代码使用Update类将应用程序升级至最新版本。
var ud:Updater=new Updater();
ud.update(new File("newest.air"),"1.3");
23.3.5 升级AIR应用程序实例
本实例中假设最新导出的AIR安装包为1.3版本,并放置于工程“bin”文件夹下。
升级AIR应用程序实例的步骤如下所示。
新建AIR工程。
在“bin”文件夹下的“Preferences”文件夹下创建“version.txt”文件。“version.txt”文件中存储当前应用程序的版本号,如“1.2”(小于最新版本号)。
编写检查版本号函数checkVersion。checkVersion函数的主要功能是读取“version.txt”中的版本号。判断是否需要升级AIR程序。以下代码定义了checkVersion函数。
private function checkVersion():void //检查版本号信息
{
/*读取版本号*/
var stream:FileStream = new FileStream();
stream.open(file, FileMode.READ); //file变量指向“version.txt”
var prevVersion:String = stream.readUTFBytes(stream.bytesAvailable);
stream.close();
//记录的版本小于当前最新版本号时,需要下载最新的air文件
if (prevVersion < currentVersion)
{
urlStream.addEventListener(Event.COMPLETE, loaded); //添加对加载完成的监听
urlStream.load(urlReq); //加载air文件
}
}
编写下载最新版本函数loaded。loaded函数使用FileStream类获得AIR应用程序的二进制数据,并将二进制数据写入到本地的AIR文件中。以下代码定义了loaded函数和writeAirFile函数。
private function loaded(event:Event):void //加载完成后,下载air文件
{
urlStream.readBytes(fileData, 0, urlStream.bytesAvailable); //数据读取到fileData数组中
writeAirFile(); //下载air文件
}
private function writeAirFile():void //写入新的air文件
{
var file1:File = File.desktopDirectory.resolve("p1.air"); //路径为桌面
var fileStream:FileStream = new FileStream();
fileStream.addEventListener(Event.CLOSE, fileClosed); //添加写文件完成的监听
fileStream.openAsync(file1, FileMode.WRITE);
fileStream.writeBytes(fileData, 0, fileData.length); //开始写文件
fileStream.close();
}
编写更新AIR应用程序代码。将最新版本AIR应用程序写入本地路径后,使用update方法更新原程序,同时修改“version.txt”文件。以下代码更新AIR应用程序,并修改“version.txt”文件内的版本号。
private function fileClosed(event:Event):void //下载文件完成处理函数
{
Alert.show("下载文件完成");
/*升级版本*/
var updater:Updater = new Updater();
var airFile:File = File.desktopDirectory.resolve("p1.air");
var version:String = currentVersion;
updater.update(airFile, version); //开始升级版本
saveFile(); //存储当前版本信息
}
private function saveFile():void //存储最新版本号
{
var stream:FileStream = new FileStream();
stream.open(file, FileMode.WRITE); //file变量指向“version.txt”
stream.writeUTFBytes(currentVersion);
stream.close();
}
完成剩余代码。剩余代码包括程序初始化函数、变量定义、类的引用等。
以下代码是完整的应用程序代码。
<?xml version="1.0" encoding="utf-8"?>
<mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml"
layout="absolute"
applicationComplete="init()">
<mx:Script>
<![CDATA[
import flash.filesystem.*; //引用flash.filesystem下的类
import mx.controls.Alert; //引用Alert类
public var file:File; //定义File实例
[Bindable]
public var currentVersion:String = "1.3"; //定义最新版本号
public var urlString:String ="p1.air"; //最新版本air的路径
//定义URLRequest实例
public var urlReq:URLRequest = new URLRequest(urlString);
public var urlStream:URLStream = new URLStream(); //定义URLStream实例
public var fileData:ByteArray = new ByteArray(); //定义ByteArray实例
public function init():void //应用程序初始化处理函数
{
//“version.txt”存储版本信息
file = File.applicationResourceDirectory.resolve ("Preferences /version.txt");
if(file.exists) //若文件存在时,检查版本号
{
checkVersion();
}
else //若文件不存在时,创建文件
{
firstRun();
}
}
private function checkVersion():void //检查版本号信息
{
/*读取版本号*/
var stream:FileStream = new FileStream();
stream.open(file, FileMode.READ);
var prevVersion:String = stream.readUTFBytes(stream. bytes Available);
stream.close();
//记录的版本小于当前最新版本号时,需要下载最新的air文件
if (prevVersion < currentVersion)
{
//添加对加载完成的监听
urlStream.addEventListener(Event.COMPLETE, loaded);
urlStream.load(urlReq); //加载air文件
}
}
private function firstRun():void
{
saveFile(); //存储当前版本号
}
private function saveFile():void //存储当前版本处理函数
{
var stream:FileStream = new FileStream();
stream.open(file, FileMode.WRITE);
stream.writeUTFBytes(currentVersion);
stream.close();
}
private function loaded(event:Event):void //加载完成后,下载air文件
{
//数据读取到fileData数组中
urlStream.readBytes(fileData, 0, urlStream.bytesAvailable);
writeAirFile(); //下载air文件
}
private function writeAirFile():void //下载air文件处理函数
{
//下载路径为桌面
var file1:File = File.desktopDirectory.resolve("p1.air");
var fileStream:FileStream = new FileStream();
//添加写文件完成的监听
fileStream.addEventListener(Event.CLOSE, fileClosed);
fileStream.openAsync(file1, FileMode.WRITE);
fileStream.writeBytes(fileData, 0, fileData.length); //开始写文件
fileStream.close();
}
private function fileClosed(event:Event):void //下载文件完成处理函数
{
Alert.show("下载文件完成");
/*升级版本*/
var updater:Updater = new Updater();
var airFile:File = File.desktopDirectory.resolve("p1.air");
var version:String = currentVersion;
updater.update(airFile, version); //开始升级版本
saveFile(); //存储当前版本信息
}
]]>
</mx:Script>
<mx:Label fontSize="35" text="版本{currentVersion}" horizontalCenter="0" verticalCenter="0"/>
</mx:WindowedApplication>
按下Ctrl+F11键,编译运行程序。运行效果如图23-6所示。
图23-7 升级AIR应用程序实例的运行效果
23.4 Flex 3.0中使用Ajax技术
在前面章节里曾介绍过Flex 3.0中如何使用其他Web开发技术,但未涉及Ajax技术。Ajax技术是一种非常流行的Web开发技术,其主要特点是无刷新性。本章将介绍Ajax技术的基础知识及如何在Flex 3.0中使用Ajax技术。
23.4.1 Ajax技术简介
Ajax是“Asynchronous JavaScript and XML”(异步JavaScript和XML)的简称。Ajax技术是一组技术的结合。Ajax利用通信技术(以SOAP和XML为代表)向服务器发送和接收异步请求和响应,然后使用JavaScript、DOM、HTML、CSS技术来处理响应。
Ajax技术通过JavaScript语言调用服务器端的方法,而不需要刷新浏览器,从而减轻了服务器端的负担,也更快捷地响应用户交互。另外,Ajax不需要任何浏览器插件,但浏览器需要允许运行JavaScript。
Ajax技术具体包括如下五种技术:
(47) 使用XHTML+CSS的表示样式。
(48) 使用DOM(Document Object Model)进行动态显示及交互。
(49) 使用XML和XSLT进行数据交换及相关操作。
(50) 使用XMLHttpRequest类进行异步数据查询、检索。
(51) 使用JavaScript整合所有技术。
使用Ajax开发Web应用程序最关键的技术是JavaScript语言和XMLHttpRequest类。本书中不展开详解Ajax技术开发,着重介绍如何在Flex 3.0中调用Ajax技术。
23.4.2 使用<mx:HTML>组件调用Ajax技术
在Flex 3.0中使用<mx:HTML>组件可加载包含Ajax技术的网页,其语法如下所示。
<mx:HTML id="HTML组件id"… location="网页路径"/>
以下代码使用<mx:HTML>组件加载了“www.google.cn”网页。
<mx:HTML id="html" location="www.google.cn"/>
<mx:HTML>组件在加载网页时,加载网页中的全部内容,包括JavaScript(JavaScript是Ajax技术实现的关键)。Flex 3.0中调用JavaScript函数的语法如下所示。
HTML组件id.htmlControl.window.javascript函数(参数列表);
以下代码在单击“OK”按钮时,调用“test.html”网页中的javascript函数init。
<mx:HTML id="html" location="test.html"/>
<mx:Button label="OK" click="html.htmlControl.window.init();"/>
23.4.3 Flex应用程序结合Ajax技术实例
Ajax技术已广泛应用于互联网的开发。许多无刷新的网页或有动态效果网页都使用了Ajax技术。其中,应用Ajax技术最成功的例子是Google的地图搜索。本小节中将调用Google公司免费提供的包含Ajax技术的测试网页来实现地图搜索功能。Flex 3.0结合Ajax技术实例的步骤如下所示。
新建AIR工程。
编写“yahoo.html”文件。
“yahoo.html”文件是HTML网页,包含了自定义的javascript函数来完成地图搜索功能。以下代码是“yahoo.html”文件的源代码。
<!DOCTYPEhtml
PUBLIC"-//W3C//DTDXHTML1.0Strict//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<script src="http://api.maps.yahoo.com/ajaxymap?v=3.4&appid=mapsnap0" type="text/javascript"/>
<script type="text/javascript">
var Imap; //定义变量Imap
function init()//初始化函数
{
Imap = new YMap(document.getElementById('map')); //使用YMap类初始化Imap变量
Imap.addTypeControl(); //添加类型面板
Imap.addPanControl(); //添加方向面板
Imap.addZoomLong(); //添加缩放长条
Imap.addZoomShort(); //添加缩入短条
//绘制地图
Imap.drawZoomAndCenter('601 Townsend St. San Francisco, CA 94103', 5);
}
function lookupAddress(address) //搜索地址函数
{
//根据地址绘制地图
YEvent.Capture(Imap,
EventsList.onEndGeoCode,
function (result)
{
if (!result.success)
{
alert('This address could not be geo-coded.');
return;
}
Imap.drawZoomAndCenter(result.GeoPoint, 2);
});
Imap.geoCodeAddress(address);
}
window.onload =init; //在网页加载时调用init函数
</script>
</head>
<body>
<div id="map"/>
</body>
</html>
(52) javascript代码定义于<head>标签下的<script>标签下。
(53) “<scriptsrc="http://api.maps.yahoo.com/ajaxymap?v=3.4&appid=mapsnap0" type="text/ javascript"/>”表示引用该地址下的javascript类文件。程序中出现的YMap和YEvent类均在此类文件中定义,但对用户不可见。用户可查看Google Maps官方的使用说明。
(54) HTML网页不会自动执行javascript函数。“window.onload=init;”表示在网页加载时调用init函数。
编写Flex应用程序的外观模型。Flex应用程序的外观模型包括<mx:HTML>组件、输入框组件、按钮组件等。以下代码是外观模型的MXML代码。
<mx:VBox paddingTop="0" paddingLeft="0" width="100%" height="100%">
<mx:HBox width="100%">
<mx:Label text="位置:" color="#ffffff" width="5%"/>
<mx:TextInput width="55%" id="address"/>
<mx:Button label="加载中..." enabled="false" id="mapButton" width="10%"/>
<mx:Button label="保存" width="10%"/>
<mx:Button label="复制" width="10%"/>
</mx:HBox>
<mx:HTML id="map" width="800" height="600"/><!--HTML组件,用以加载网页-->
</mx:VBox>
外观模型效果如图23-8所示。
图23-8 Flex结合Ajax实例的外观效果
添加搜索地图的ActionScript 3.0代码。ActionScript 3.0代码中调用“yahoo.html”文件中的lookupAddress函数来完成搜索功能。实例中有两处需要添加搜索地图的ActionScript 3.0代码:输入框组件的enter事件和“开始搜索”按钮的click事件。enter事件在用户输入数据并按下回车键时触发。以下代码是添加处理后的输入框组件和按钮组件。
<mx:TextInput width="55%" id="address" enter="map.htmlControl.window. lookup Address(address.text);"/>
<mx:Button label="加载中..." enabled="false" id="mapButton" width="10%" click="map.htmlControl.window.lookupAddress(address.text);"/>
按钮mapButton用以搜索地图。先是显示“加载中…”,在网页加载完成后显示“开始搜索”。
编写函数takeSnapshot。takeSnapshot函数用以截图并保存图片。以下代码定义了takeSnapshot函数。
private function takeSnapshot():void //保存图片处理函数
{
var home:File = File.desktopDirectory.resolve("map.png"); //设置保存路径
//添加对选择路径事件的监听,并定义其处理代码
home.addEventListener(Event.SELECT,
function (e:Event):void
{
var img:ByteArray = getImage(); //获得图片资源
/*使用FileStream类保存图片*/
var stream:FileStream = new FileStream();
stream.openAsync(File(e.target), FileMode.WRITE);
stream.addEventListener(Event.CLOSE,
function(ee:Event):void
{
Alert.show("图片保存成功!", "提示", Alert.OK);
});
stream.writeBytes(img);
stream.close();
});
home.browseForSave("图片保存路径?"); //打开选择路径窗口
}
private function getImage():ByteArray //获得图片资源
{
var bd:BitmapData = getBitmapData(map.width, map.height); //获得图片数据
var pnge:PNGEncoder=new PNGEncoder(); //定义PNGEncoder类型变量
var img:ByteArray = pnge.encode(bd); //对图片数据进行编码
return img;
}
private function getBitmapData(width:uint, height:uint):BitmapData //获得图片数据
{
var bd:BitmapData = new BitmapData(width, height);
bd.draw(map);
return bd;
}
(55) “bd.draw(map);”语句表示对<mx:HTML>组件截图。
(56) addEventListenner方法的第二个参数一般为处理函数名,但也可直接定义处理代码,此时不需要函数名。
编写函数copyToClipboard。copyToClipboard函数用于将截图复制到剪切板中。以下代码定义了copyToClipboard函数。
private function copyToClipboard():void //复制图片资源至剪切板
{
var mapFile:File = getMapFile(); //获得图片文件
//复制至剪切板
ClipboardManager.accessClipboard()
function ():void
{
var td:TransferableData = new TransferableData(); //定义TransferableData类型变量
//数据处理
td.addData([mapFile], TransferableFormats.FILE_LIST_FORMAT);
ClipboardManager.data = td; //复制至剪切板
Alert.show("图片已复制至剪切板!", "提示", Alert.OK); //提示复制成功
});
}
ClipboardManager类中的accessClipboard方法用以传递数据至剪切板。
完成剩余代码。剩余代码包括初始化处理函数、变量定义、类的引用等。
以下代码是完整的应用程序代码。
<?xml version="1.0" encoding="utf-8"?>
<mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml"
title="结合Ajax实例"
creationComplete="init();"
width="805" maxWidth="805" height="675"
fontSize="13"
maxHeight="675" paddingTop="2"
paddingLeft="2" verticalScrollPolicy="off"
horizontalScrollPolicy="off"
showStatusBar="false">
<mx:Script>
<![CDATA[
import flash.filesystem.*; //引用"flash.filesystem"下的全部类
import mx.controls.Alert; //引用Alert类
import flash.desktop.*; //引用"flash.desktop"下的全部类
import mx.graphics.codec.PNGEncoder; //引用PNGEncoder类
private const WIN_WIDTH:uint = 820; //定义宽度
private const WIN_HEIGHT:uint = 670; //定义高度
private function init():void //应用程序初始化处理函数
{
//HTML组件map加载完成时的处理代码
map.addEventListener(Event.COMPLETE,
function():void
{
mapButton.label = "开始搜索";
mapButton.enabled = true;
});
map.location = "app-resource:/yahoo.html"; //HTML组件map的URL地址
window.visible = true;
}
private function takeSnapshot():void //保存图片处理函数
{
//设置保存路径
var home:File = File.desktopDirectory.resolve("map.png");
//添加对选择路径事件的监听,并定义其处理代码
home.addEventListener(Event.SELECT,
function (e:Event):void
{
var img:ByteArray = getImage(); //获得图片资源
/*使用FileStream类保存图片*/
var stream:FileStream = new FileStream();
stream.openAsync(File(e.target), FileMode.WRITE);
stream.addEventListener(Event.CLOSE,
function(ee:Event):void
{
Alert.show("图片保存成功!", "提示", Alert.OK);
});
stream.writeBytes(img);
stream.close();
});
home.browseForSave("图片保存路径?"); //打开选择路径窗口
}
private function copyToClipboard():void //复制图片资源至剪切板
{
var mapFile:File = getMapFile(); //获得图片文件
//复制至剪切板
ClipboardManager.accessClipboard(
function ():void
{
//定义TransferableData类型变量
var td:TransferableData = new TransferableData();
//数据处理
td.addData([mapFile], TransferableFormats.FILE_ LIST_FORMAT);
ClipboardManager.data = td; //复制至剪切板
//提示复制成功
Alert.show("图片已复制至剪切板!", "提示", Alert.OK);
});
}
private function getImage():ByteArray //获得图片资源
{
//获得图片数据
var bd:BitmapData = getBitmapData(map.width, map.height);
var pnge:PNGEncoder=new PNGEncoder(); //定义PNGEncoder类型变量
var img:ByteArray = pnge.encode(bd); //对图片数据进行编码
return img;
}
//获得图片数据
private function getBitmapData(width:uint, height:uint):BitmapData
{
var bd:BitmapData = new BitmapData(width, height);
bd.draw(map);
return bd;
}
private function getMapFile():File //获得图片文件
{
//创建"map.png"文件
var mapFile:File = File.createTempDirectory().resolve("map.png");
var img:ByteArray = getImage(); //获得图片数据
//将图片数据写入到"map.png"文件中
var stream:FileStream = new FileStream();
stream.open(mapFile, FileMode.WRITE);
stream.writeBytes(img);
stream.close();
return mapFile;
}
]]>
</mx:Script>
<mx:VBox paddingTop="0" paddingLeft="0" width="100%" height="100%">
<mx:HBox width="100%">
<mx:Label text="位置:" color="#ffffff" width="5%"/>
<mx:TextInputwidth="55%"id="address" enter="map.htmlControl.window.lookupAddress(address.text);"/>
<mx:Buttonlabel="加载中..."enabled="false"id="mapButton" width="10%" click="map.htmlControl.window.lookupAddress(address.text);"/>
<mx:Button label="保存" width="10%" click="takeSnapshot();"/>
<mx:Button label="拷贝" width="10%" click="copyToClipboard();"/>
</mx:HBox>
<mx:HTML id="map" width="800" height="600"/> <!--HTML组件,用以加载网页-->
</mx:VBox>
</mx:WindowedApplication>
按下Ctrl+F11快捷键,编译运行程序。运行效果如图23-9所示。
图23-9 Flex结合Ajax实例的运行效果
发表评论
-
Flex远程调用机制RemoteObject应用技巧
2009-07-15 17:52 1294本文主要讨论Flex在客户端与J2EE中间层数据交互的过程。 ... -
Flex RemoteObject类参考
2009-07-15 17:46 1020<mx:RemoteObject>标记允许使用AM ... -
Flex与Java的整合
2009-07-15 16:07 1437整合Flex和Java—配置篇 Author:yongtre ... -
Flex与JavaScript的交互:调用与被调用
2009-04-16 13:50 1036一、在JavaScript中调用Fle ... -
flex3.0新特性(1)----本地资源的操作,如加载PDF文件,对本地数据库的操作
2009-04-14 11:12 2613Flex 3.0中最大的变化在于新增AIR工程。AIR应用程序 ... -
Flex3.0新特性2----Flex-Ajax Bridge
2009-04-14 10:52 432223.5 使用Flex-Ajax Bridge ... -
FABridge
2009-04-14 10:38 2800使用方法: 解释: 1. 由于swf(基 ... -
学习Flex的超好网站
2009-04-09 16:31 803http://www.airia.cn
相关推荐
Adobe AIR(Adobe Integrated Runtime)是一种由Adobe Systems开发的跨平台运行环境,支持使用HTML、CSS、JavaScript以及Flex等技术开发的应用程序,能够在桌面操作系统上运行。此文档主要介绍如何使用HTML和AJAX来...
《ActionScript 3.0 语言参考》是 Flash® Player 和 Adobe AIR™ 应用程序编程接口 (API) 的参考手册。 此版本包括支持 Adobe AIR 运行时环境的新 ActionScript 类、方法和属性。 在可能的情况下,特定于 AIR 的新...
- 桌面部署:使用Adobe AIR技术,Flex应用程序可被转换成桌面应用,通过桌面运行。 7. Flex开发流程: - 设计和规划:确定应用需求,设计用户界面和交互流程。 - 编写代码:使用MXML和ActionScript开发应用程序的...
- **定义**: Adobe Integrated Runtime (AIR) 是一种跨操作系统运行时环境,旨在利用现有的 Web 开发技术(如 Flash、Flex、HTML、JavaScript 和 AJAX)来构建富 Internet 应用程序,并将其部署为桌面应用程序。...
Flex Air开发中文教程是一本专为富媒体软件开发者设计的实战型指南,旨在教会读者如何利用Adobe Flex技术来构建和部署Adobe Integrated Runtime (AIR)应用程序。Flex是基于ActionScript和MXML的开源框架,用于创建...
- **定义**: Adobe Integrated Runtime (AIR) 是一种跨操作系统的运行时环境,它能够利用现有的 Web 技术(如 Flash、Flex、HTML、JavaScript 和 AJAX)来构建富互联网应用程序,并将其部署为桌面应用程序。...
在标题中提到的"Flex实现的AJAX"可能是指使用Flex来创建一个具备AJAX特性的应用。尽管Flex本身并不直接支持AJAX,但可以通过Flash Player与服务器进行通信,实现类似的效果。例如,使用Flex的HTTPService或...
- Flex3.0 中的 Ajax 技术。 - Flex-Ajax Bridge 控制技术。 #### 七、实例篇 - **FLV 播放器**:基于 Flex 构建视频播放功能。 - **CairngormStore 分析**:深入研究官方示例项目。 - **客户端与服务器交互**: ...
- **Ǒ(uAdobe FleX & AIRbgv~xQ^(u**:这部分提到了Adobe Flex与Adobe AIR的结合,Adobe AIR允许开发者创建跨平台的桌面应用程序。 - **eBay**:举了一个著名的使用Flex开发的应用案例——eBay网站的部分功能就是用...
2. **ActionScript 3.0** - Flex的主要编程语言,基于ECMAScript,用于编写应用程序逻辑。 3. **Flex Compiler** - 将MXML和ActionScript代码转换为SWF文件的工具。 4. **Flex Component Lifecycle** - 组件的创建、...
Adobe Integrated Runtime (AIR) 是一款跨操作系统平台的运行时环境,旨在利用现有Web开发技术(包括Flash、Flex、HTML、JavaScript、Ajax等)构建并部署富互联网应用程序(RIA)为桌面应用程序。AIR的独特之处在于...
本書全面講解Adobe AIR(Adobe Integrated Runtime)技術和開發實踐。AIR允許利用現有的Web開發技能(包括Flash、Flex、HTML、JavaScript、Ajax)優勢,建立和配置跨平台(或跨作業系統)的桌面RIA(Rich Internet ...
- **Adobe AIR**:允许开发者使用HTML、AJAX、Flex等技术创建桌面应用程序,并且可以在多种操作系统上运行。 - **Adobe Flash Builder**:一款集成开发环境(IDE),专为使用ActionScript和Flex开发RIA而设计。 #...
Flex的核心特性包括使用MXML(一种基于XML的声明性语言)描述用户界面布局和行为,以及使用ActionScript 3.0(一种面向对象的编程语言)编写客户端逻辑。此外,Flex还提供了一个丰富的组件库和交互式调试器,以支持...
Adobe Integrated Runtime(AIR)是Adobe推出的一个跨平台运行时环境,使得开发人员能够使用Flash技术创建能在桌面系统上运行的应用程序。AIR应用程序结合了Web开发的灵活性和桌面应用的功能性,比如访问本地文件...
### 使用Adobe Flex开发AIR应用程序的关键知识点 #### 一、Adobe Integrated Runtime (AIR) 概述 **Adobe Integrated Runtime (AIR)** 是一个由Adobe系统开发的跨平台运行环境,允许开发者利用HTML、JavaScript、...
书中介绍了如何使用 Flex 的样式系统来控制组件外观、如何使用自定义组件来增强应用程序的功能性以及如何利用 Flex 的动画效果来提升用户体验等方面的知识。 **8. 数据访问与服务端交互** Flex 应用程序通常需要与...