本文转自:http://www.cnblogs.com/artwl/p/3396330.html

近期项目中可能要用到Flash存取数据,并与JS互调,所以就看了一下ActionScript 3.0,现把学习结果分享一下,希望对新手有帮助。

目录

  ActionScript 3.0简介

  Hello World

  文件读写

  数据存储(SharedObject)

  与JS互调

ActionScript 3.0简介

  ActionScript 3.0 是一种强大的面向对象编程语言,ActionScript 3 符合 ECMAScript Language Specification 第三版。它还包含基于 ECMAScript Edition 4 的功能,比如类、包和名称空间;可选的静态类型;生成器和迭代器;以及非结构化赋值(destructuring assignments)。随着 Web应用程序项目需求的增长,也要求 ActionScript 引擎有重大的突破。ActionScript 3 引入了一个新的高度优化的 ActionScript Virtual Machine(AVM2),与 AVM1 相比,AVM2 的性能有了显著的提高。这使 ActionScript 3 代码的执行速度几乎比以前的 ActionScript 代码快了 10 倍。(本段内容来自百度百科

  ActionScript 3.0 核心语言有很多新特性:

  1、运行时异常处理机制

  2、运行时类型

  3、密封类

  4、闭包方法

  5、使用E4X理论处理XML数据

  6、正则表达式

  7、命名空间

  8、新基元数据类型

Hello World

  这里用一个简单的例子演示如何开发ActionScript 3.0 程序(IDE为Flash CS6),内容包括添加组件,注册事件,跟踪输出。

  1、打开Flash CS6,新建一个ActionScript 3.0 文档,保存为HelloWorld.fla

  注:此处还可以选择“文件”菜单,点击“新建”命令进行新建。

  2、在新建的文档上添加按钮组件

  把组件命名为btnHelloWorld,并设置label值为“Hello World”,如下图所示:

  3、添加文档类(即ActionScript 3.0 代码文件)

  输入类名称“HelloWorld”(可自定义),然后保存(Ctrl + S)或点击输入框后面的“编辑类定义”按钮,会弹出图中的提示框,点确定即可。然后再次点击输入框后面的“编辑类定义”按钮,IDE会自动创建一个HelloWorld类,并打开AS代码编辑界面:

  把文档保存为HelloWorld.as,与HelloWorld.fla在同一目录下。

  4、给按钮组件注册点击事件。

  注册事件要引入 flash.events.MouseEvent 包,注册事件要用 addEventListener(事件类型, 事件处理方法),这个跟JS中的基本一致。

  这里要注意的是,如何取到文档中添加的那个bthHelloWorld按钮呢?不同于JS中我们用ID或TagName或Name去查找,在AS中界面上定义的组件可以直接用实例名称。

  代码如下:

  5、添加跟踪代码:在点击按钮时,输出Hello World!

  AS中的跟踪代码用trace(string),类型于JS中的console.log(),代码如下:

  6、运行,查看效果

  按 Ctrl + Enter 快捷键运行,然后点击界面上的按钮,观察输出面板中的输出:

  至此,HelloWorld DEMO已经完成。怎么样,有JS基础的同学是不是觉得很容易上手?

  不过目前介绍的只是Flash ActionScript 3.0中的冰山一角。

文件读写

  AS 3.0 中的文件读要用到 flash.net.URLLoader 和 flash.net.URLRequest 和 flash.net.URLLoaderDataFormat 包,文件写要用到 flash.net.FileReference 包。另外,对于文件的写更像是文件下载,会弹出一个选择路径的窗口。在AIR中可以用其他方式实现不弹窗的文件写。

  1、文件读取

  文件数据的读取是用 URLLoader 加载一个 URLRequest 。

  URLLoader可用来加载文本文件、二进制数据或外部变量的值。使用方法如下:

var dataLoad:URLLoader = new URLLoader();

//文件路径
var dataFilePath: String = "demo.txt"; //构造URLRequest
var dataRequest: URLRequest = new URLRequest(dataFilePath); //设置数据格式
dataLoad.dataFormat = URLLoaderDataFormat.TEXT; //注册加载完成事件
dataLoad.addEventListener(Event.COMPLETE, loadDataComplete); //开始加载
dataLoad.load(dataRequest); //数据读取完成后进行处理
private function loadDataComplete(e: Event):void{
var fileData:String = dataLoad.data;
}

  2、文件写入

  写文件直接用FileReference的save即可,代码如下:

var f:FileReference = new FileReference;
f.save(内容, 文件名);

  我写了一个DEMO,界面如下,界面绘制方式跟上面界绍的一样。

  AS代码如下:

package  {

    import flash.display.MovieClip;
import flash.events.MouseEvent;
import flash.events.Event;
import flash.net.URLLoader;
import flash.net.URLRequest;
import flash.net.URLLoaderDataFormat;
import flash.net.FileReference;
import flash.text.TextFormat; public class ReadWriteDemo extends MovieClip { private var dataLoad:URLLoader = new URLLoader();
private var dataFilePath: String = "demo.txt";
private var dataRequest: URLRequest = new URLRequest(dataFilePath); public function ReadWriteDemo() {
btnFuncInit();
// constructor code
} private function btnFuncInit():void {
var titleTF:TextFormat = new TextFormat();
titleTF.size = 30;
lblTitle.setStyle("textFormat", titleTF); var btnTF: TextFormat = new TextFormat();
btnTF.size = 20;
btnLoad.setStyle("textFormat", btnTF);
btnSave.setStyle("textFormat", btnTF);
btnClear.setStyle("textFormat", btnTF);
txtContent.setStyle("textFormat", btnTF); btnLoad.addEventListener(MouseEvent.CLICK, loadData);
btnSave.addEventListener(MouseEvent.CLICK, saveData);
btnClear.addEventListener(MouseEvent.CLICK, clearData);
} private function loadData(evt:MouseEvent):void{
dataLoad.dataFormat = URLLoaderDataFormat.TEXT;
dataLoad.addEventListener(Event.COMPLETE, loadDataComplete);
dataLoad.load(dataRequest);
} private function loadDataComplete(e: Event):void{
txtContent.text = dataLoad.data;
} private function saveData(evt:MouseEvent):void {
var val: String = txtContent.text;
var f:FileReference = new FileReference;
f.save( val, "demo.txt");
} private function clearData(evt:MouseEvent):void {
txtContent.text = "";
}
} }

  代码中有部分是控制格式的,可以不看。

数据存储(SharedObject)

  如果不依赖服输务端,AS中的数据存储一般用的是SharedObject(译为本地共享对象),SharedObject跟浏览器中的cookie类似,不同的有两点:

  1、SharedObject默认没有过期时间,cookie默认随浏览器关掉就失效

  2、SharedObject存储数据默认限制为100k,cookie要小一些,大多数浏览器支持最大为 4096 字节的 Cookie。

  SharedObject的使用比较简单,示例代码如下:

//创建一个名为test的本地共享对象;
var so = SharedObject.getLocal("test"); //给共享对象添加一个username的属性并存储数据
so.data.username="artwl"; //添加该属性不会将它保存到硬盘。只有影片被卸载或使用语句so.flush()强制保存信息。
so.flush(); //现在可以用trace语句获取一下username的值;
trace(so.data.username);

  DEMO界面如下:

  AS代码如下:

package  {

    import flash.display.MovieClip;
import flash.events.MouseEvent;
import flash.net.SharedObject;
import flash.text.TextFormat; public class ShareObjectDemo extends MovieClip {
public function ShareObjectDemo() {
btnFuncInit();
// constructor code
} private function btnFuncInit():void {
var titleTF:TextFormat = new TextFormat();
titleTF.size = 30;
lblTitle.setStyle("textFormat", titleTF); var btnTF: TextFormat = new TextFormat();
btnTF.size = 20;
btnLoad.setStyle("textFormat", btnTF);
btnSave.setStyle("textFormat", btnTF);
btnClear.setStyle("textFormat", btnTF);
txtContent.setStyle("textFormat", btnTF); btnLoad.addEventListener(MouseEvent.CLICK, loadData);
btnSave.addEventListener(MouseEvent.CLICK, saveData);
btnClear.addEventListener(MouseEvent.CLICK, clearData);
} private function loadData(evt:MouseEvent):void{
var mySo = SharedObject.getLocal("setting");
var setting = mySo.data.setting;
if (setting != undefined && setting.length) {
txtContent.text = setting;
} else {
txtContent.text = "暂无数据";
}
} private function saveData(evt:MouseEvent):void {
var val: String = txtContent.text;
var mySo = SharedObject.getLocal("setting");
mySo.data.setting = val;
mySo.flush();
} private function clearData(evt:MouseEvent):void {
txtContent.text = "";
}
} }

与JS互调

  ActionScript 与 JS 互调可能是很多前端开发者比较感兴趣的地方。

  需要引入import flash.external.ExternalInterface;

  1、ActionScript调用JavaScript的方法

  这里要用到ExternalInterface类的call方法:

  ExternalInterface.call(functionName:String,...arguments):   fuctionName:要调用的JavaScript函数名   arguments:参数,可选

  1)不带参数的情况:

//JavaScript:
function Show() {
  alert("I am a js function");
} //ActionScript直接用一条语句调用
ExternalInterface.call("Show");

  2)带参数的情况:

//JavaScript:
function Show(message) {
  alert(message);
} //ActionScript:
ExternalInterface.call("Show","I am a message from AS");

  2、JavaScript调用ActionScript的方法

ExternalInterface.addCallback( functionName:String, closure:Function):void  functionName:要注册的函数名 closure:对应的执行函数

  示例:

//ActionScript:ExternalInterface.addCallback("Show",OnShow);

private function OnShow(message:String):string{
return message;
}  
//JavaScript:
function CallAS() {
//swfobj是页面引入的swf对象
swfobj.Show("i am a message from js");
}

  这里有几点需要注意(都是这两天踩过的坑):

  1、页面上引入的swf中allowScriptAccess 参数的值要改为 always ,否则AS调JS会不起作用(权限问题):

<param name="allowScriptAccess" value="always" />

  2、如果直接用Flash CS6的“文件”->“发布预览”->“HTML”命令生成HTML页面,引入的object会有两层,默认只有外层的object标签上有id属性,我们要自己在内层object也加上id属性(值可以自己写),这样做的目地是,我们不知道浏览器最终渲染时用的是哪个object,所以要自己判断,HTML代码如下:

<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="440" height="290" id="FlashJSDemo" align="middle">
<param name="movie" value="FlashJSDemo.swf" />
<param name="quality" value="high" />
<param name="bgcolor" value="#ffffff" />
<param name="play" value="true" />
<param name="loop" value="true" />
<param name="wmode" value="window" />
<param name="scale" value="showall" />
<param name="menu" value="true" />
<param name="devicefont" value="false" />
<param name="salign" value="" />
<param name="allowScriptAccess" value="always" />
<!--[if !IE]>-->
<object type="application/x-shockwave-flash" data="FlashJSDemo.swf" id="FlashJSDemo1" width="440" height="290">
<param name="movie" value="FlashJSDemo.swf" />
<param name="quality" value="high" />
<param name="bgcolor" value="#ffffff" />
<param name="play" value="true" />
<param name="loop" value="true" />
<param name="wmode" value="window" />
<param name="scale" value="showall" />
<param name="menu" value="true" />
<param name="devicefont" value="false" />
<param name="salign" value="" />
<param name="allowScriptAccess" value="always" />
<!--<![endif]-->
<a href="http://www.adobe.com/go/getflash">
<img src="http://www.adobe.com/images/shared/download_buttons/get_flash_player.gif" alt="获得 Adobe Flash Player" />
</a>
<!--[if !IE]>-->
</object>
<!--<![endif]-->
</object>

  这里内部object的属性 id="FlashJSDemo1"就是我自己加上去的。

  在JS中要这样判断:

var FlashJSDemo1 = document.getElementById('FlashJSDemo');
var FlashJSDemo2 = document.getElementById('FlashJSDemo1'); //这一句就是判断用的是哪个object
var FlashJSDemo = FlashJSDemo1.setName != undefined ? FlashJSDemo1 : FlashJSDemo2;
FlashJSDemo.setName(name);

  注:这里的setName是我在AS中定义的,供JS调用的。

  在我机子上,用chrome浏览器的测试结果是最终setName绑到了内层object上。

  本文DEMO可以点击这里查看

作者:Artwl

出处:http://artwl.cnblogs.com

本文首发博客园,版权归作者跟博客园共有。转载必须保留本段声明,并在页面显著位置给出本文链接,否则保留追究法律责任的权利。

[转]ActionScript 3.0入门:Hello World、文件读写、数据存储(SharedObject)、与JS互调的更多相关文章

  1. ActionScript 3.0入门:Hello World、文件读写、数据存储(SharedObject)、与JS互调

    近期项目中可能要用到Flash存取数据,并与JS互调,所以就看了一下ActionScript 3.0,现把学习结果分享一下,希望对新手有帮助. 目录 ActionScript 3.0简介 Hello ...

  2. Android中使用File文件进行数据存储

    Android中使用File文件进行数据存储 上一篇学到使用SharedPerences进行数据存储,接下来学习一下使用File进行存储 我们有时候可以将数据直接以文件的形式保存在设备中, 例如:文本 ...

  3. Python的文件读写与存储

    文件读写与存储 7.2. 读写文件 open()返回一个文件对象,最常见的用法带有两个参数:open(filename, mode). >>> f = open('workfile' ...

  4. [ActionScript 3.0] 跨域策略文件crossdomain.xml配置详解

    1.简介 flash在跨域时唯一的限制策略就是crossdomain.xml文件,该文件限制了flash是否可以跨域读写数据以及允许从什么地方跨域读写数据. 位于www.a.com域中的SWF文件要访 ...

  5. 快速入门Python中文件读写IO是如何来操作外部数据的?

    读写文件是最常见的IO操作.Python内置了读写文件的函数,用法和C是兼容的. 读写文件前,我们先必须了解一下,在磁盘上读写文件的功能都是由操作系统提供的,现代操作系统不允许普通的程序直接操作磁盘, ...

  6. JavaScript笔记01——数据存储(包括.js文件的引用)

    While, generally speaking, HTML is for content and CSS is for presentation, JavaScript is for intera ...

  7. [ActionScript 3.0] 将组件 SWC 文件导入 Flash

    在向其它开发人员分发组件时,您可以包含以下说明,以便他们能够立即安装和使用组件.  导入 SWC 文件: 将 SWC 文件复制到 Configuration/Components 目录中. 重新启动 ...

  8. Matlab入门学习(文件读写)

    一.save,load >> a=[ ]; >> b=[ ] b = >> save('b.mat','a','b');%a file named b.mat wi ...

  9. [ActionScript 3.0] AS向php发送二进制数据方法之——在URLRequest中构造HTTP协议发送数据

    主类 HTTPSendPHP.as package { import com.JPEGEncoder.JPGEncoder; import com.fylib.httpRequest.HttpRequ ...

随机推荐

  1. 与众不同 windows phone (39) - 8.0 联系人和日历

    [源码下载] 与众不同 windows phone (39) - 8.0 联系人和日历 作者:webabcd 介绍与众不同 windows phone 8.0 之 联系人和日历 自定义联系人存储的增删 ...

  2. csharp: InvokeHelper

    Entity Framework https://entityframework.codeplex.com/ Enterprise Library https://entlib.codeplex.co ...

  3. 随心所欲导出你的 UI 界面到 PDF 文件

    使用 C1PDF 控件可以导出文件到 PDF 文件,结合 .NET 平台特性你可以在任何客户端生成自定义报表.你可以打印任何 UI 界面,例如 DataGrid 导出到 PDF. 在本篇文章中我们将阐 ...

  4. JPA(4)表表关联关系

    在我们做数据库设计的时候,最烦的就是各种表之间的关联关系了,关联关系有:一对多,多对一,一对一,其中还有单向和双向的区别. 1.双向一对多及多对一映射:既然是双向,那么就是同一类的了:双向一对多关系中 ...

  5. [moka同学笔记]yii2.0数据库操作以及分页

    1.model中models/article.php 1 <?php 2 3 namespace app\models; 4 5 use Yii; 6 7 /** 8 * This is the ...

  6. 使用 Canvas 和 JavaScript 创建逼真的下雨效果

    HTML5 规范引进了很多新特性,其中最令人期待的之一就是 Canvas 元素,HTML5 Canvas 提供了通过 JavaScript 绘制图形的方法,非常强大.这里向大家展示一个使用 Canva ...

  7. css3实现switch开关效果

    之前阿里电面的时候问的一个问题,今天抽时间做了个demo. html结构 <div class="container"> <div class="bg_ ...

  8. ExtJs中xtype与组件类的对应表

    from:http://blog.163.com/jx_dream/blog/static/117056627201223091021410/ 核心提示:我们在使用 ExtJs 创建组件时最容易理解的 ...

  9. iOS设计模式之工厂方法模式

    工厂方法模式 基本理解 工厂方法模式:定义一个用于创建对象的接口,让子类决定实例化哪一个类.工厂方法使一个类的实例化延迟到其子类. 简单工厂的最大优点就是工厂类中包含了必要的逻辑判断,根据客户端的选择 ...

  10. iOS-UI分析利器--Reveal安装破解以及简单使用

    前言:在 iOS 开发中,我们有时很希望有一款类似 Web 开发中的 UI Debug 工具(例如:Firebug),让我们能够实时查看 UI 的结构,还可以实时更改某个 UIView 的位置和大小的 ...