关闭

AS3 的一些用法

标签: classfunctionflashactionscriptstringcomments
3629人阅读 评论(0) 收藏 举报
分类:

as3用了这么久,还没有仔细的看看细节,所以做了这么几个测试

  1. /**
  2. * as3类测试文件1
  3. * @author 湘西悍匪
  4. * @version 0.1
  5. */
  6.  
  7. package test{
  8.  
  9. public class Test {
  10. private static var a:String;
  11. /**
  12. * 以下的程序块在as3之中,被看作一个匿名的static函数
  13. * 和java的块相同的是,as3里的块语句执行的顺序是和java一样的,先于构造函数执行
  14. * 和java的块不同的是,java的块不是被看作static的
  15. * failed code:
  16. * private var a:String;
  17. * {
  18. * a = "hello";
  19. * trace(a);
  20. * }
  21. * throw:Access of undefined property a.
  22. * 以上代码会抛出错误,因为成员变量a不是static的,所以在这个块中将无法访问
  23. */
  24. {
  25. a = "hello";
  26. trace(a);
  27. }
  28. public function Test(){
  29. trace("in construct:"+a);
  30. }
  31. }
  32.  
  33. }
  1. /**
  2. * as3类测试文件2
  3. * @author 湘西悍匪
  4. * @version 0.1
  5. */
  6.  
  7. package test {
  8. /**
  9. * 在as3中,private ,portected关键字只能用于类成员的定义,不能在package里使用这两个关键字
  10. * package里只能有1个显示定义(public ,internal都算显式定义)
  11. * failed code:
  12. * package{
  13. * public class Test2{
  14. * }
  15. * class A{
  16. * }
  17. * }
  18. * throw:An ActionScript file can not have more than one externally visible definition: Test2,A
  19. * 以上代码抛出一个异常,ActionScript文件里只能有1个显式定义
  20. *
  21. * 在as3中,如果没有使用public关键字来标注一个class为公共的
  22. * 则这个class默认为internal的
  23. * failed code:
  24. * package{
  25. * class Test2{
  26. * public function Test2(){
  27. * trace("ok");
  28. * }
  29. * }
  30. * }
  31. * thorw:Type was not found or was not a compile-time constant: Test2.
  32. * 以上代码会抛出一个异常,该类型在编译时未能被找到,也就是说,没有用public
  33. * 来标注这个class,这个class是internal的,internal指的是仅仅能在内部被访问
  34. */
  35. public class Test2 {
  36. public function put():void {
  37. trace(new A().value);
  38. trace(new B().value);
  39. trace("A.getValueFromB:"+new A().getValueFromB());
  40. trace(n);
  41. }
  42. }
  43. }
  44.  
  45. /**
  46. *同样的,internal 方法和变量都遵循这个原则
  47. * 若果要任何内部成员可访问这些internal的属性和方法则这些属性和方法必须要放在包外,并且不再任何内类之中
  48. * 这样任何内部的类,都可以访问到这些internal的方法和变量。
  49. * 如果是在类的内部使用了internal关键字,则这个属性或方法,仅在这个类的内部可被访问.且不能被其他的internal class 访问
  50. */
  51. internal function t():void{
  52. trace("_________");
  53. }
  54. internal var n:Number = 5;
  55.  
  56. /**
  57. * as3中一个package里只能定义个class,其他的class定义要放在package以外
  58. * public关键字限定的class只能放在package内,也就是说,需要给外部可使用的class放在package里
  59. * 而其他辅助的internal class,则放在package外,给外部访问的class需要用public关键字来标记
  60. * failed code:
  61. * package{
  62. * class Test{
  63. * }
  64. * }
  65. * public class A{
  66. * }
  67. * throw: The public attribute can only be used inside a package.
  68. * 以上代码抛出一个异常,public 关键字 只能在package里使用
  69. */
  70. internal class A {
  71. public var value:String ="a";
  72. /**
  73. * 这里可以看到,internal class在内部环境里是可以访问的到的
  74. * class A可以访问到class B
  75. * 如果是在外部(例如在fla里的帧上写代码,试图创建一个B的实例),则会抛出错误
  76. */
  77. public function getValueFromB():String{
  78. t();
  79. return new B().value;
  80. }
  81. }
  82. internal class B {
  83. public var value:String = "b";
  84. }
  1. /**
  2. * as3类测试文件3
  3. * @author 湘西悍匪
  4. * @version 0.1
  5. */
  6.  
  7. package test{
  8.  
  9. ///////////////////////////////////////////////////////////////////////////
  10. // 在as3中,只有public 关键字限定的类,方法,属性才能被外部访问
  11. // 其他如private ,portected,internal等关键字限定的东西,都不可以被外部访问
  12. // private ,portected,internal在类的内部都是可以访问的,没有限制
  13. //////////////////////////////////////////////////////////////////////////
  14. public class Test3 {
  15. private var a:String;
  16. public var b:String;
  17. protected var c:String;
  18. internal var d:String;
  19. public function Test3(){
  20. a = "a";
  21. b = "b";
  22. c = "c";
  23. d = "d";
  24. }
  25. public function traceAll():void{
  26. trace(a);
  27. trace(b);
  28. trace(c);
  29. trace(d);
  30. }
  31. }
  32.  
  33. }
  1. /**
  2. * as3类测试文件4
  3. * @author 湘西悍匪
  4. * @version 0.1
  5. */
  6.  
  7. package test{
  8. /**
  9. * 在as3中,public class的编译顺序早于interval class
  10. * 通过以下代码可以测试到:
  11. * package{
  12. * public class A{
  13. * {
  14. * trace(”A was initialize”);
  15. * }
  16. * }
  17. * }
  18. * internal class B{
  19. * {
  20. * trace(”B was initialize”);
  21. * }
  22. * }
  23. * 以上代码运行结果为:
  24. * A was initialize
  25. * B was initialize
  26. *
  27. * 所以,不能将一个public class 的基类设置成一个internal class
  28. * failed code:
  29. * package{
  30. * public class A extends B{
  31. * }
  32. * }
  33. * internal class B{}
  34. * throw:Forward reference to base class B.
  35. * 以上代码抛出一个异常,因为A比B的编译顺序要早,在A被加载开始初始化的时候,B还没有加载
  36. */
  37. public class Test4 {
  38. public function Test4(){
  39. new B().traceAll();
  40. }
  41. }
  42.  
  43. }
  44. internal class A {
  45. private var a:String;
  46. public var b:String;
  47. protected var c:String;
  48. internal var d:String;
  49. public function A(){
  50. trace(im running!”);
  51. a = “a”;
  52. b = “b”;
  53. c = “c”;
  54. d = “d”;
  55. }
  56. private function f1():void{
  57. trace(f1);
  58. }
  59. public function f2():void{
  60. trace(f2);
  61. }
  62. protected function f3():void{
  63. trace(f3);
  64. }
  65. internal function f4():void{
  66. trace(f4);
  67. }
  68. }
  69. internal class B extends A{
  70. public function traceAll():void{
  71. /**
  72. * private限定符表示严格的私有只能在当前类可以访问,而子类不能访问
  73. * public限定符表示完全公开,当前类,子类,外部都可以访问
  74. * protected限定符表示友好的,当前类,子类,可访问,但外部不能访问
  75. * internal限定符表示内部友好,当前类,子类,可访问,外部不能访问
  76. */
  77. //trace(this.a);
  78. trace(this.b);
  79. trace(this.c);
  80. trace(this.d);
  81. /**
  82. * 对于和父类重名的方法,as3规定,必须使用override关键字标明重载
  83. * 这和java有点不一样,因为as3中没有多态。对于同方法名,不同参数和不同返回值的方法,as3会认为是定义重复
  84. * private 标记的方法不会从父类继承下来,所以这里的f1不需要重载
  85. * public,protected,internal这些关键字定义的方法,如果在子类里有重名,是必须要重载的
  86. * as3里的重载和java是不一样的,必须严格的按照父类的方法定义进行重载
  87. * java里允许子类对父类方法重载而且可以改变访问限制,如public 的可以在子类里变成private的
  88. * java的规则是从宽松的访问方式到严格的可以,反之则不行,例如将private的变成public,这将抛出异常
  89. * as3里父类的方法限定符号是什么,子类也必须使用这个限定符号,并且参数,返回值也必须是一致的
  90. * 从外观上来看,父类方法和子类方法的区别在于子类多出了一个override关键字
  91. * 方法被重载以后,可以通过super关键字访问到父类的原始方法,如:super.f2();
  92. * 在被重载的方法里这个super关键字对位置没有要求,不必放在第1行,可以根据需求来改变
  93. */
  94. f1();
  95. f2();
  96. f3();
  97. f4();
  98. }
  99.  
  100. private function f1():void{
  101. trace(b.f1);
  102. }
  103. public override function f2():void{
  104. super.f2();
  105. trace(b.f2);
  106. }
  107. protected override function f3():void{
  108. trace(b.f3);
  109. }
  110. internal override function f4():void{
  111. trace(b.f4);
  112. }
  113. }
  1. /**
  2. * as3类测试文件5
  3. * @author 湘西悍匪
  4. * @version 0.1
  5. */
  6.  
  7. package test{
  8. /**
  9. * 根据as3里,actionscript文件package里只能有1个显示定义的原则。
  10. * 如象flash.utils.trace这样的包方法,需要单独编写一个as文件
  11. * 因为要被外部使用,所以方法的限定符号为public
  12. * 文件名要和function名字存成一样
  13. */
  14. public function myTrace(v:*):void{
  15. trace(v);
  16. }
  17. }

以上仅仅自己测试得出的结论,如有错误,请告之我,谢谢

名片设计

Aug 15

在AS3中使用嵌入字体

在flash中,我们常会遇到需要嵌入字体的情况,在以往的flash版本中,嵌入字体相信是大家已经耳熟能详的事情了,这里我要写的是在as3中如何嵌入字体,以及在as3中嵌入字体所要注意的一些问题。

首先我们先制作一个嵌入字体资源文件,先新建一个fla,打开库,在库中新建一个字体,选择你想要嵌入的字体,我这里选的是“方正黄草简体”1.jpg

然后选中这个字体,对它的linkage进行设置

2.jpg

最后保存并发布为swf,这样我们的嵌入字体资源文件就制作完成了,现在我们来看看如何使用这个嵌入字体,新建一个fla,在第一帧写上如下代码:

  1. //新建一个loader
  2. var loader:Loader = new Loader();
  3. //设置applicationDomain
  4. var context:LoaderContext = new LoaderContext();
  5. context.applicationDomain = ApplicationDomain.currentDomain;
  6. loader.contentLoaderInfo.addEventListener(Event.COMPLETE,complete);
  7. loader.load(new URLRequest("fontLib.swf"),context);
  8.  
  9. function complete(e:Event) {
  10. //获取到嵌入的字体
  11. var f:Class = loader.contentLoaderInfo.applicationDomain.getDefinition("Font1") as Class;
  12. //注册字体
  13. Font.registerFont(f);
  14. var tf:TextFormat = new TextFormat();
  15. tf.font = "方正黄草简体";
  16. tf.size = 24;
  17. var txt:TextField = new TextField();
  18. //使用嵌入字体
  19. txt.embedFonts=true;
  20. txt.text="嵌入字体!";
  21. txt.setTextFormat(tf);
  22. addChild(txt);
  23. }

关于Loader的用法,可以查看帮助,而ApplicationDomain的具体信息,你可以去看下eidiot的这篇教程,而这里我们主要是了解Font,这是as3中使用嵌入字体的关键,Font.registerFont方法能注册一个字体到全局字体列表中,Font.enumerateFonts()方法可以返回一个当前嵌入字体的列表,你可以通过查看这个列表来看你的字体是否注册成功,这个方法有一个布尔值的参数,true为包含设备字体,flase为仅显示嵌入的字体,另外值得注意的是as3中使用嵌入字体,必须将文本的embedFonts设置为true,否则无法正常显示。
以上就是as3嵌入字体的全部了,如有遗漏或疑问,欢迎你前来讨论。

Aug 14

Doomsday_世界之窗2.0skin

最近为世界之窗浏览器做的skin Doomsday,希望朋友们喜欢^________^

doomsday.rar

Aug 12

Nantbuilder logo设计

最近为Nantbuilder的logo设计

Aug 8

as3与后台通讯

目前flash在各方个面的应用越来越广,而flash也不单只是注重自身绚丽的效果,也需要和外界程序交换数据,以实现更强大的功能,随着as3的到来,flash和外部交互的方式也越来越简便和合理化。今天就在这里谈谈as3和后台数据的交互(这里选择as3+php架构,其他配置同理)。

在as3里,原来的loadVars方法已经被废弃,而改用一系列的类来实现与后台数据的交互,这些类是:URLLoader,URLLoaderDataFormat,URLStream,URLVariables。
URLLoader 类和原来的loadVars类似,是加载文本,2进制数据,xml,URL数据等信息的有力工具。URLLoader接受一个URLRequest 作为构造的参数,使用load方法来加载数据。URLLoder也可以进行监听,这点也loadVars不同,一个简单的示例如下:

  1. //////////////////actionscript code//////////////////////////////////////////
  2. //声明一个URLLoader
  3. var loader:URLLoader = new URLLoader();
  4. //监听数载加载完成事件
  5. loader.addEventListener(Event.COMPLETE,loaded);
  6. //事件相应函数
  7. function loaded(e:Event){
  8. trace(loader.data);
  9. // output : this data is from php!
  10. }
  11. //加载test.php
  12. loader.load(new URLRequest("test.php"));
  1. // ////////////////test.php code/////////////////////////////////
  2. <?php
  3. //声明一个变量并赋给一个字符串
  4. $data ='this data is form php!';
  5. //输出这个变量给flash
  6. echo $data;
  7. ?>

从上面的示例可以看出,as3和后台交互是多么简单,但这只是单项的交互,如果要flash向后台发送数据并传回数据该如何去做呢?这个时候你可能会把代码该成这样:

  1. //actionscript code
  2. var loader:URLLoader = new URLLoader();
  3. loader.data={message:"hello im flash!"};
  4. loader.addEventListener(Event.COMPLETE,loaded);
  5. function loaded(e:Event){
  6. trace(loader.data);
  7. // output : this is flash say:
  8. }
  9. loader.load(new URLRequest("test.php"));
  1. //test.php code//
  2. <?php
  3. $flashData = $_POST['message'];
  4. echo "this is flash say:$flashData";
  5. ?>

看看输出的代码,你得到了什么?是的,信息并没有传输到php,你还是在用loadVars的方式试图传送数据,但as3里已经不是这样了,URLLoader的data只有在数据被下载完时才会被初始化,在数据没有加载完成时,它是等于null的,也就是说,它只包含接受到的数据,而不管要发送的数据,那么,as3里如何向后台发送数据呢?使用URLVariables。URLVariables允许你在flash和后台程序间传输变量,as3里已经把发送和接受数据分离,再也不像as2的loadVars那样,一个类通吃所有了,那么这个URLVariables如何送要发送的数据呢?
你可能找遍了URLLoader的文档也没有发现与它相关的东西,是的URLLoader并不和URLVariables有关联,而是URLRequest在使用它,URLRequest包含整个http请求的所有信息,所以我们要发送的数据要放在这里,URLRequest有一个data属性他接受一个object类型的参数,这就是我们要发送的数据。同时你可能还注意到了,URLRequest也管理用什么样的方式来发送http请求,它的method属性接受一个字符参数,post或者是get。好了,现在我们来看看它们是怎么工作的:

  1. //actionscript code
  2. var loader:URLLoader = new URLLoader();
  3. //声明一个URLRequest
  4. var url:URLRequest = new URLRequest("test.php");
  5. //设置传输方式为POST
  6. url.method = URLRequestMethod.POST;
  7. //声明一个URLVariables
  8. var values:URLVariables = new URLVariables();
  9. //设置要传输的信息
  10. values.message="hello im flash!";
  11. url.data = values;
  12. loader.addEventListener(Event.COMPLETE,loaded);
  13. function loaded(e:Event){
  14. trace(loader.data);
  15. // output : this is flash say:hello im flash!
  16. }
  17. loader.load(url);
  1. //test.php code//
  2. <?php
  3. $flashData = $_POST['message'];
  4. echo "this is flash say:$flashData";
  5. ?>

怎么样,是不是也很方便的实现了as3和后台的数据传输?恩,现在我们的程序可以双向交互数据了,但这只是一些简单的数据,如果你要传输带有结构的数据,(熟悉as2的人都知道loadVars可以自动解析下载数据的结构),让我们先按loadVars的方式来尝试下,看看URLLoader是不是能自动的解析下载的数据。

  1. //actionscript code
  2. var loader:URLLoader = new URLLoader();
  3. //声明一个URLRequest
  4. var url:URLRequest = new URLRequest("test.php");
  5. //设置传输方式为POST
  6. url.method = URLRequestMethod.POST;
  7. //声明一个URLVariables
  8. var values:URLVariables = new URLVariables();
  9. //设置要传输的信息
  10. values.message="hello im flash!";
  11. url.data = values;
  12. loader.addEventListener(Event.COMPLETE,loaded);
  13. function loaded(e:Event){
  14. trace(loader.data);
  15. //outPut: phpMessage=im php message!&flashMessage=hello im flash!
  16. trace(loader.data.phpMessage);
  17. // thorw Error;
  18. trace(loader.data.flashMessage);
  19. // thorw Error;
  20. }
  21. loader.load(url);
  1. //test.php code//
  2. <?php
  3. $flashData = $_POST['message'];
  4. $phpMessage = 'im php message!';
  5. echo "phpMessage=$phpMessage&flashMessage=$flashData";
  6. ?>

可以看到,数据被完全下载下来了,但是却没有被解析,还抛出了异常,那么是不是URLLoader就不能自动解析数据了呢?不是,相反URLLoader提供了多种数据解析方式供你选择。这些数据解析方式都在URLLoaderDataFormat里,他们是:BINARY-以2进制的方式解析 TEXT-以文本的方式解析 VARIABLES-以变量-值配对的方式解析。URLLoader的dataFormat属性提供了对解析方式的选择,好,我们再来修改下程序使它变的更完美些:

  1. //actionscript code
  2. var loader:URLLoader = new URLLoader();
  3. //声明一个URLRequest
  4. var url:URLRequest = new URLRequest("test.php");
  5. //设置传输方式为POST
  6. url.method = URLRequestMethod.POST;
  7. //声明一个URLVariables
  8. var values:URLVariables = new URLVariables();
  9. //设置要传输的信息
  10. values.message="hello im flash!";
  11. url.data = values;
  12. //设置以变量-值配对的方式解析数据
  13. loader.dataFormat = URLLoaderDataFormat.VARIABLES;
  14. loader.addEventListener(Event.COMPLETE,loaded);
  15. function loaded(e:Event){
  16. trace(loader.data);
  17. //outPut: phpMessage=im php message!&flashMessage=hello im flash!
  18. trace(loader.data.phpMessage);
  19. // im php message!
  20. trace(loader.data.flashMessage);
  21. // hello im flash!
  22. }
  23. loader.load(url);
  1. //test.php code//
  2. <?php
  3. $flashData = $_POST['message'];
  4. $phpMessage = 'im php message!';
  5. echo "phpMessage=$phpMessage&flashMessage=$flashData";
  6. ?>

以上这些就是as3里和后台交互的基础内容,现在你可以在as3里创建这样的交互,获取动态数据来丰富你的程序,在你开始自己动手实验之前,还有一些东西值得注意:
1,记得捕获和处理异常(上述的例子里都是假定在完美的测试环境下运行,所以没有加上异常捕获和处理的代码,但现实中你可能会遇到各种各样的情况)URLLoader可能引发好几种异常情况(详细请参见说明文档)
你应该通过监听ioError和securityError事件,或者通过try-catch来处理他们,即使你确信不会发生这样的问题。
2,文件的编码,这是个常见的问题,经常很多数据变成了乱码,或者解析出错,都是因为编码的问题,我的做法是确保发送的数据和后台传回的数据都是UTF-8格式(因为flash默认编码为utf-8)
最后希望这篇文章能对你有所帮助,也欢迎你留言讨论相关的问题。

 
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:67652次
    • 积分:924
    • 等级:
    • 排名:千里之外
    • 原创:20篇
    • 转载:30篇
    • 译文:0篇
    • 评论:4条
    文章分类
    最新评论