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

  近期项目中可能要用到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 = "";}}}
View Code

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

数据存储(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 = "";}}}
View Code

与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可以点击这里查看

转载于:https://www.cnblogs.com/artwl/p/3396330.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/360283.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

阿里云服务器mysql默认密码_阿里云服务器修改MySQL初始密码---Linux学习笔记

主要方法就是修改 MySQL按照文件下面的my.cnf文件首先是找到my.cnf文件&#xff0c;# find / -name “my.cnf”# cd /etc接下来最好是先备份my.cnf文件&#xff0c;对于初手而言#/etc vi my.cnf之后找到[mysqld]的段&#xff0c;在那段中插入一行&#xff1a;skip-grant-tables…

Quasar和Akka –比较

actor模型是用于容错和高度可扩展系统的设计模式。 角色是独立的工作程序模块&#xff0c;仅通过消息传递与其他角色进行通信&#xff0c;可以与其他角色隔离而失败&#xff0c;但是可以监视其他角色的故障并在发生这种情况时采取一些恢复措施。 参与者是简单&#xff0c;孤立但…

dlgdata.cpp错误提示 解决方案

1、在测试编写继承CStatic类组件时候&#xff0c;发现在调用调试过程中弹出一个错误&#xff0c;点忽略还可以继续运行。如下图&#xff1a; 2、dlgdata.cpp此文件是VS安装目录\Microsoft Visual Studio .NET 2003\Vc7\atlmfc\src\mfc中的文件&#xff0c;而出现此错误一般是所…

mysql主从复制时间配置_MySQL主从复制配置

环境CentOS 7.5Docker 1.13.1MySQL 8.0.16基于以上环境启动三个mysql容器&#xff0c;一个为master&#xff0c;二个为slavemaster和slave使用的mysql版本是完全一致的&#xff0c;未测试不同版本的mysql配置master编辑配置文件编辑master的配置文件my.cnf$ vim /usr/mysql/con…

告别异步代码

Quasar是一个向JVM添加真正的轻量级线程&#xff08;纤维&#xff09;的库。 它们非常便宜且非常快-实际上&#xff0c;光纤的行为就像Erlang进程或Go goroutines-并允许您编写简单的阻塞代码&#xff0c;同时享受与复杂异步代码相同的性能优势。 在本文中&#xff0c;我们将学…

如何利用多核CPU来加速你的Linux命令

如何利用多核CPU来加速你的Linux命令 原文出处&#xff1a; rankfocus 译文出处&#xff1a; 外刊IT评论 你是否曾经有过要计算一个非常大的数据(几百GB)的需求&#xff1f;或在里面搜索&#xff0c;或其它操作——一些无法并行的操作。数据专家们&#xff0c;我是在对你们说…

魔术二传手反模式

设置者和获取者是邪恶的。 创建JavaBean定义时&#xff0c;这似乎是个好主意。 但是它们对Java社区造成了很大的伤害。 通常不如null指针那么多&#xff0c;但足够了。 首先&#xff0c;许多初级人员认为实现setter和getter&#xff08;嘿&#xff0c;在Eclispe中只需单击几下…

sqlwarning mysql_mysql提示[Warning] Invalid (old?) table or database name问题的解决方法

DROP TABLE IF EXISTS [TEMP_TABLE_NAME];create temporary table [TEMP_TABLE_NAME] select col1,col2,... from [TABLE_NAME];alter table [TEMP_TABLE_NAME] add unique idx_col1(col1);经过以上操作中&#xff0c;多次出现该warning问题。通过查询和跟踪调试源码&#xff0…

C语言操作符优先级

转自&#xff1a;http://www.cnblogs.com/xiehy/archive/2010/02/04/1663825.html 优先级 运算符 含 义 要求运算 对象的个数 结合方向 1 () [] -> . 圆括号 下标运算符 指向结构体成员运算符 结构体成员运算符 自左至右 2 ! 逻辑非运算符 1 (单目运算符)…

linux mysql select_MySQL-Select语句高级应用

阅读目录1.1 SELECT高级应用1.2 select中where子句使用1.3 select中ORDER BY子句1.4 LIMIT子句1.5 多表连接查询1.6 Informatica_schema获取元数据1.7 参考文献1.1 SELECT高级应用1.1.1 前期准备工作本次测试使用的是world数据库&#xff0c;由MySQL官方提供下载地址&#xff1…

为AWT的机器人创建DSL

Java SDK附带了java.awt.Robot类&#xff0c;该类允许键盘和鼠标输入的自动化以及屏幕捕获的创建。 如果您想编写一个模拟用户输入的小型测试应用程序&#xff0c;或者只想自动化一些重复文本的输入&#xff0c;则此功能非常有用。 但是您不想每次都编写一个完整的Java应用程序…

Win7下硬盘安装Redhat双系统

Win7下硬盘安装Redhat Linux 形成双系统过程详解 需要软件 EasyBCD2.0 和 linux ISO 系统镜像 RedHat linux下载地址&#xff1a;http://www.linuxidc.com/Linux/2013-01/78017.htm 安装前准备工作: 1 一个 Windows 盘 D E F 任选其一都可以&#xff0c;将其格式化为FAT32 格式…

java rmi漏洞工具_学生会私房菜【20200924】Weblogic WLS核心组件反序列化命令执行突破(CVE20182628)漏洞复现...

学生会私房菜学生会私房菜是通过学生会信箱收集同学们的来稿&#xff0c;挑选其中的优质文档&#xff0c;不定期进行文档推送的主题。本期文档内容为&#xff1a;Weblogic WLS核心组件反序列化命令执行突破(CVE-2018-2628)漏洞复现》作者介绍&#xff1a;ChowChow&#xff0c;一…

Java泛型中的多态

从作为Java程序员的早期开始&#xff0c;我们都知道如何实例化和使用Collection对象。 实例化为具体类的List接口将如下所示。 List myArrayList new ArrayList();如果myArrayList应该仅保存Integer对象&#xff0c;则从Java 5编译器开始&#xff0c;按照Java Generics规范…

ASP.NET伪静态-无法读取配置文件,因为它超过了最大文件大小的解决办法

一直都在使用微软URLRewriter&#xff0c;具体的使用方法我就不多说了&#xff0c;网上文章很多。 但最近遇到一个问题&#xff0c;就是当web.config文件里面设置伪静态规则过多&#xff0c;大于2M的时候&#xff0c;就报错&#xff1a;无法读取配置文件&#xff0c;因为它超过…

java定义list_我的Java Web之路59 - Java中的泛型

本系列文章旨在记录和总结自己在Java Web开发之路上的知识点、经验、问题和思考&#xff0c;希望能帮助更多(Java)码农和想成为(Java)码农的人。目录介绍再谈Java中的类型为什么需要泛型&#xff1f;Java中的泛型泛型类型泛型方法总结介绍还记得我在这篇文章(我的Java Web之路3…

Spring查找方法示例

当一个bean依赖于另一个bean时&#xff0c;我们使用setter属性或通过构造函数注入bean。 getter方法将向我们返回已设置的引用&#xff0c;但是假设您每次调用getter方法时都想要一个依赖bean的新实例&#xff0c;那么您可能将不得不采用另一种方法。 在本文中&#xff0c;我…

mysql判断数字的函数_Mysql必读MySql判断汉字、日期、数字的具体函数

《Mysql必读MySql判断汉字、日期、数字的具体函数》要点&#xff1a;本文介绍了Mysql必读MySql判断汉字、日期、数字的具体函数&#xff0c;希望对您有用。如果有疑问&#xff0c;可以联系我们。MYSQL学习几个平常用的mysql函数,MySql判断汉字、日期、数字的具体函数分享给大家…

编码:可视化位图

在过去的一个月左右的时间里&#xff0c;我每天花费一些时间来阅读Neo4j代码库的新部分&#xff0c;以使其更加熟悉&#xff0c;而我最喜欢的类之一是Bits类&#xff0c;该类可以完成所有底层工作&#xff0c;并且到磁盘。 特别是&#xff0c;我喜欢它的toString方法&#xff…

通过更改透明度使图片为透明

使用AlphaBlend函数 函数功能 该函数用来显示具有指定透明度的图像。函数原型 AlphaBlend(HDC hdcDest,int nXOriginDest,int nYOriginDest,int nWidthDest,int hHeightDest,HDC hdcSrc,int nXOriginSrc,int nYOriginSrc,int nWidthSrc,int nHeightSrc,BLENDFUNCTION blendFunc…