AS3.0 – 523326 http://www.523326.com 写想写的东西 Wed, 28 Nov 2018 05:33:14 +0000 zh-CN hourly 1 https://wordpress.org/?v=4.9.8 AIR获取到本机本地IP地址 http://www.523326.com/?p=88 http://www.523326.com/?p=88#respond Thu, 12 Feb 2015 08:58:40 +0000 http://www.523326.com/?p=88 继续阅读 AIR获取到本机本地IP地址]]> 对于Flash Player而言是无法获取到本机Ip地址的,毕竟对一些安全性的东西是有限制的。而作为安装程序的AIR 却可以获取到。但是AIR 也有一定限制条件,所有桌面操作系统和 AIR for TV 设备均支持此功能,但移动设备不支持此功能。

下面代码需要新建AIR for Desktop(flash pro中)(在flash builder中新建actionscript项目 并选择桌面)

AIR for DeskTop提供方法NetworkInfo可以获取到本机IP等信息


if( NetworkInfo.isSupported ){
var netWord:NetworkInfo = NetworkInfo.networkInfo;
var infos:Vector.<NetworkInterface> = netWord.findInterfaces( );
var len:int = infos.length;
for( var i:int = 0;i < len;i ++ ){
var info:NetworkInterface = infos[ i ];
var adds:Vector.<InterfaceAddress> = info.addresses;
var count:int = adds.length;
for( var j:int = 0;j < count;j ++ ){//如果获取本机实际IP 则是索引为0
var add:InterfaceAddress = adds[ j ];
trace("ip:",add.address );//IP地址
trace("broadcast:",add.broadcast );//广播地址
trace( "ipVersion:",add.ipVersion );//ip版本 IPV4 或 IPV6
}
trace( "displayName:",info.displayName );//显示名称
trace( "hardwareAddress:",info.hardwareAddress );//物理地址
trace( "name:",info.name );//接口名称
trace("===========================================");
}
}

]]>
http://www.523326.com/?feed=rss2&p=88 0
AS3接口使用记录 http://www.523326.com/?p=82 http://www.523326.com/?p=82#respond Wed, 11 Feb 2015 14:28:47 +0000 http://www.523326.com/?p=82 继续阅读 AS3接口使用记录]]> 曾今在学习AS3代码的时候,书本上有提过关于接口这样的技术。但实际中接触的不多,原因大概是 底层框架已经是被写好,而自己的话接触的确实较少。而自己的小项目 更是犯不着用这个。一直搁着,也没怎么去弄。一度觉得可有可无的一种技术。直到今天用了之后,才觉得是个不错的东东,便做一记录。好了,闲话少说,正题开始。

接口是什么?

通俗的比喻就是,把一堆相关性不是很强的东西,通过接口来达到一定的归纳。

现实例子就是,U盘与支持U盘的电子设备,以及USB数据线之类的。因为大家都实现一种规定的接口,所以能够在一台电脑上支持所有实现了此接口的U盘。同理 一个U盘也可以在各种不同的实现了此接口的设备上工作。

接口定义关键字  interface

接口实现关键字 implements

下面就以U盘和电脑的关系来练习下

IUSB_3_0接口类


package com._523326.myInterface
{
public interface IUSB_3_0
{
/**
*USB3.0打印方法
*
*/
function print( ):void
}
}

IUSB_2_0接口类


package com._523326.myInterface
{
public interface IUSB_2_0
{
/**
*USB2.0的打印
*
*/
function printf( ):void
}
}

ISellPlat接口类

ISellPlat接口类 用于售价 具有售卖性质的 可以实现此接口
package com._523326.myInterface
{
public interface ISellPlat
{
/**
*喊出广告语
*
*/
function sayADWords( ):void;
}
}

AplleDisk类实现了IUSB3 IUSB2接口 由于其具有售卖的性质 所以同时实现了ISellPlat接口


package com._523326.sample.udisk
{
import com._523326.myInterface.ISellPlat;
import com._523326.myInterface.IUSB_2_0;
import com._523326.myInterface.IUSB_3_0;

public class AppleDisk implements IUSB_3_0,IUSB_2_0,ISellPlat
{
public function AppleDisk()
{
}
public function print( ):void
{
trace("我是AppleDisk 实现了 IUSB2.0 IUSB3.0接口 此方法实现了是IUSB3.0");
}
public function printf( ):void
{
trace("我是AppleDisk 实现了 IUSB2.0 IUSB3.0接口 此方法实现了是IUSB2.0");
}
public function sayADWords( ):void
{
trace("AppleDisk 售价 ¥200");
}
}
}

TomatoDisk类只实现了IUSB2接口,所以这个U盘是不能插入某台电脑的USB3插口的 因为具有售卖的性质 所以同时实现了ISellPlat接口


package com._523326.sample.udisk
{
import com._523326.myInterface.ISellPlat;
import com._523326.myInterface.IUSB_2_0;

public class TomatoDisk implements IUSB_2_0,ISellPlat
{
public function TomatoDisk()
{
}
public function printf( ):void
{
trace("我是TomatoDisk 实现了IUSB2.0接口");
}
public function sayADWords( ):void
{
trace("TomatoDisk 售价 ¥100");
}
}
}

RiceDisk类 此U盘实现了USB3接口,可以插进电脑的USB3插口,同时具有售卖性质 所以实现了ISellPlat接口


package com._523326.sample.udisk
{
import com._523326.myInterface.ISellPlat;
import com._523326.myInterface.IUSB_3_0;

public class RiceDisk implements IUSB_3_0,ISellPlat
{
public function RiceDisk()
{
}
public function print( ):void
{
trace("我是RiceDisk 实现了USB3.0接口");
}
public function sayADWords( ):void
{
trace("RiceDisk 售价 ¥130");
}
}
}

下面是电脑类,没有使用电脑基类。为了方便起见 省去了 基类的继承

DogPc类 这是一台电脑 具有售卖的性质 所以同样实现了ISellPlat接口,同时这台电脑上面支持含有USB3的插口,可以对USB3的U盘进行操作


package com._523326.sample.pc
{
import com._523326.myInterface.ISellPlat;
import com._523326.myInterface.IUSB_3_0;

public class DogPC implements ISellPlat
{
public function DogPC()
{
}
public function readFromDisk(type:IUSB_3_0):void
{
trace("DogPc从USB3.0接口 读取U盘");
type.print( );
}
public function writeInDisk(type:IUSB_3_0):void
{
trace("DogPc从USB3.0接口 写入U盘");
type.print( );
}
public function sayADWords( ):void
{
trace( "DogPc 售价 ¥2000" );
}
}
}

CatPc类 这台电脑具有售卖的性质 所以同样实现了ISellPlat接口,此电脑只包含一个USB2插口。只能插入USB2的U盘


package com._523326.sample.pc
{
import com._523326.myInterface.ISellPlat;
import com._523326.myInterface.IUSB_2_0;

public class CatPc implements ISellPlat
{
public function CatPc()
{
}
public function readFromDisk(type:IUSB_2_0):void
{
trace("CatPc从USB2.0接口 读取U盘");
type.printf( );
}
public function writeInDisk(type:IUSB_2_0):void
{
trace("CatPc从USB2.0接口 写入U盘");
type.printf( );
}
public function sayADWords( ):void
{
trace( "CatPc 售价 ¥3000" );
}
}
}

主类 假设这是一个电子产品售卖处 有电脑和U盘售卖 所以 包含一个价格提示平台sellItem


package
{
import com._523326.myInterface.ISellPlat;
import com._523326.sample.pc.CatPc;
import com._523326.sample.pc.DogPC;
import com._523326.sample.udisk.AppleDisk;
import com._523326.sample.udisk.RiceDisk;
import com._523326.sample.udisk.TomatoDisk;

import flash.display.Sprite;

public class Interface extends Sprite
{
public function Interface()
{
var catPc:CatPc = new CatPc( );
var dogPc:DogPC = new DogPC( );
var appleDisk:AppleDisk = new AppleDisk( );
var riceDisk:RiceDisk = new RiceDisk( );
var tomatoDisk:TomatoDisk = new TomatoDisk( );

catPc.readFromDisk( appleDisk );//由于AppleDisk同时实现了USB2 和USB3接口 所以其既可以插在CatPc上 又可以插在DogPc上
trace("----------------------------------------------------------");
dogPc.readFromDisk( appleDisk );
trace("----------------------------------------------------------");
catPc.readFromDisk( tomatoDisk );//因为TomatoDisk 只实现了USB2接口,所以只能在CatPc上使用,因为CatPc只有一个USB2插口,与DogPc不会兼容
trace("----------------------------------------------------------");
dogPc.readFromDisk( riceDisk );//因为RiceDisck 只实现了USB3接口,所以只能在DogPc上使用,因为DogPc只有一个USB3接口,与CatPc不会兼容
trace("----------------------------------------------------------");

//这些东西都是可以进行出售的 且都实现了ISellPlat接口,所以 都可以放在柜台上进行售卖
sellItem( catPc );
trace("----------------------------------------------------------");
sellItem( dogPc );
trace("----------------------------------------------------------");
sellItem( appleDisk );
trace("----------------------------------------------------------");
sellItem( riceDisk );
trace("----------------------------------------------------------");
sellItem( tomatoDisk );
}
//卖物品
private function sellItem( type:ISellPlat ):void
{
type.sayADWords( );
}
}
}

运行结果:

CatPc从USB2.0接口 读取U盘
我是AppleDisk 实现了 IUSB2.0 IUSB3.0接口 此方法实现了是IUSB2.0
———————————————————-
DogPc从USB3.0接口 读取U盘
我是AppleDisk 实现了 IUSB2.0 IUSB3.0接口 此方法实现了是IUSB3.0
———————————————————-
CatPc从USB2.0接口 读取U盘
我是TomatoDisk 实现了IUSB2.0接口
———————————————————-
DogPc从USB3.0接口 读取U盘
我是RiceDisk 实现了USB3.0接口
———————————————————-
CatPc 售价 ¥3000
———————————————————-
DogPc 售价 ¥2000
———————————————————-
AppleDisk 售价 ¥200
———————————————————-
RiceDisk 售价 ¥130
———————————————————-
TomatoDisk 售价 ¥100

实现的接口的物品也并非不具有相同性,其肯定是包含有一定的相关性的。正如上面的 电脑和U盘 都是商品可以售卖,如果这样的话,那么和继承有何区别? 其实的话,所有的东西 都有相同点,正如AS3中的所有类的最顶层的基类都是Object。但接口的话,能够避免比较臃肿的继承,而且接口能够实现多个,而继承却只能有一个。

 Demo

 

 

]]>
http://www.523326.com/?feed=rss2&p=82 0
AS3.0 namespace书写 http://www.523326.com/?p=79 http://www.523326.com/?p=79#respond Sun, 08 Feb 2015 08:31:44 +0000 http://www.523326.com/?p=79 继续阅读 AS3.0 namespace书写]]> 就自己而言AS3的命名空间用的确实不多,今天偶然翻翻书看到,于是便觉得这个东西其实还是挺不错的。对于封装的概念阐释的比较具体。

如果在一个项目中,交由A 写一些处理文本方面的工具方法,交由B写一些处理显示对象的工具方法。一般情况下这些方法存在于同一个工具类里面,或者是存在于不同的里面。如果我只想使用A的工具 ,那么只需要使用A的命名空间即可,就将A写的工具给筛选出来。

 

首先看了下官方API

namespace 定义关键字

用法
namespace  name [=uri]
允许您控制定义的可见性。预定义的命名空间包括 publicprivateprotectedinternal。下列步骤说明如何创建、应用和引用命名空间:

  • 首先,使用 namespace  关键字来定义自定义命名空间。例如,代码 namespace version1 将创建名为 version1 的命名空间。
  • 其次,在属性或方法的声明中使用自定义命名空间将此命名空间应用于属性或方法。例如,代码 version1 myProperty:String 将创建名为 myProperty 的属性,该属性属于 version1 命名空间
  • 最后,通过使用 use 关键字或使用命名空间作为标识符的前缀来引用该命名空间。例如,代码 use namespace version1; 引用后续代码行的 version1 命名空间,而代码 version1::myProperty 引用 myProperty 属性的 version1 命名空间。

参数

name:Namespace — 命名空间的名称,可以是任意合法的标识符。
uri:String — 命名空间的统一资源标识符 (URI)。这是一个可选参数。

大概意思是说 平时咱们使用的private public 这些访问限制符 是官方提供的,而使用namespace关键字可以自定义自己的访问限制符。

 namespace myNameSpace

而使用的时候 和 其他访问限制符类似 如定义一个变量

 myNameSpace var name:String = '朽木可雕';

而在其他地方使用的时候 可以使用use namespace myNameSpace 来使用这个命名空间中的所有对象。也可以使用 myNameSpace::name 来访问刚才定义的name 属性。那么这两个有什么区别?

使用use 的话 相当于是将采用 myNameSpace 修饰的所有对象都给公开了,而没法关闭。

使用 :: 的话 就相当于 需要的时候使用 用完之后就关闭。

下面用具体的代码实现 来阐述:

首先创建一个myFirstNameSpace.as文件,并修改内部的初始化代码。如下:

myFirstNameSpace.as:


package com._523326.nameSpaces
{
public namespace myFirstNameSpace ;
}

创建一个使用命名空间进行修饰变量的类 NSItem.as:


package com._523326
{
import com._523326.nameSpaces.myFirstNameSpace;

public class NSItem
{
myFirstNameSpace var webName:String = "朽木可雕";
public function NSItem()
{
}
}
}

然后在主类里面使用

用use 实现:


<code></code>package
{
import com._523326.NSItem;
import com._523326.nameSpaces.myFirstNameSpace;

import flash.display.Sprite;

use namespace myFirstNameSpace;
public class NameSpaceTest extends Sprite
{
private var mItem:NSItem;
public function NameSpaceTest()
{
mItem = new NSItem( );
trace( mItem.webName );//输出:朽木可雕
}
}
}

用 :: 方式实现


package
{
import com._523326.NSItem;
import com._523326.nameSpaces.myFirstNameSpace;

import flash.display.Sprite;

public class NameSpaceTest extends Sprite
{
private var mItem:NSItem;
public function NameSpaceTest()
{
mItem = new NSItem( );
trace( mItem.myFirstNameSpace::webName );//输出:朽木可雕
}
}
}

就是说 用use的话 只要在一开始使用了use namespace 那么后面某个对象对其内部属性或方法的调用 就如同public一样

而用::这种方式的话,每次调用的时候 都必须引用一次命名空间。

 

接下来再创建一个命名空间


package com._523326.nameSpaces
{
public namespace mySecNameSpace ;
}

加入到NSItem里面


package com._523326
{
import com._523326.nameSpaces.myFirstNameSpace;
import com._523326.nameSpaces.mySecNameSpace;

public class NSItem
{
mySecNameSpace var webName:String = "朽木可雕 mySecNameSpace";
myFirstNameSpace var webName:String = "朽木可雕 myFirstNameSpace";
public function NSItem()
{
}
}
}

可以看到上面的变量名称是一样的 因为属于不同的命名空间 所以变量名允许相同。(为了测试所以将变量名弄为相同)

同样在主类里面使用的话,可以发现如果将两个命名空间都使用use来打开的话,对webName变量的引用就出现报错。

而使用::的话 就是正常的显示。

 

在上面的API中可以看到还有一个URI,而其是可选的。这个就相当于给命名空间指定一个名字。如果URI相同的话 将会认为是同一个命名空间

如public namespace myFirstNameSpace = “myFirstNameSpace”;

public namespace mySecNameSpace = “myFirstNameSpace”;

那么上面的NSItem将会出现报错,因为同一个命名空间里面存在着两个相同名称的变量。

就是说如果不指定URI的值的话 命名空间的唯一性将根据其 name 来判定,如果指定了URI的值 那么将根据URI的值来判定。

 

更新 2015/03/03

namespace在XML中的使用

由于在接触XML 以来 一直到前几天个人书写XML大体如下

<?xml version=”1.0″ encoding=”utf-8″ standalone=”no”?>

<Sample>

<item>xxx</item>

</Sampel>

所以也没怎么注意xml中的命名空间问题,前两天在修改读取xlsx格式文件的时候,留意到加载进来的xlsx格式中的xml书写中包含了这样的格式

<Sample xmlns = “www.sample.com” xmlns:xx = “www.sample.com/sample”>

<item>xxx</item>

<xx:info label = “xxxx”/>

</Sample>

一开始并未留意这个,而是按照通常的解析方法来解析,

trace( xml.item)

输出发现只是一个空字符串,百度了下xmlns才知道xml也有他的命名空间,接着查找ASAPI文档。于是就有了答案


var ns:NameSpace = new NameSpace("www.sample.com");

default xml namespace = ns;

trace( xml.item)

这样便可正常获取想要的xml数据了

而我们也注意到 上面还有一个  xmlns:xx = “www.sample.com/sample”,那么这个是啥呢 注意到xml中的最后一行数据书写是

<xx:info label = “xxxx”/>

如果我们尝试获取info的label属性 发现会是空字符串


var ns:NameSpace = new NameSpace("www.sample.com");

default xml namespace = ns;

trace( xml.info.@label );

注意到 后面那句的前面 同样有一个 xmlns 即这个也是xml的命名空间 而其名字 为xx 和下面的<xx:info label = “xxxx”/>中的xx对应

于是修改代码


var ns:NameSpace = new NameSpace("www.sample.com/sample");

default xml namespace = ns;

trace( xml.info.@label );

正常输出//xxxx;

所以xml的命名空间为 通过xmlns定义的是 而冒号后面的为此命名空间的名字,至于像第一个的命名空间 ,其实可以理解为名字为空

 

 

]]>
http://www.523326.com/?feed=rss2&p=79 0
在AS3中书写顶级方法及属性 http://www.523326.com/?p=66 http://www.523326.com/?p=66#respond Sat, 07 Feb 2015 09:04:31 +0000 http://www.523326.com/?p=66 继续阅读 在AS3中书写顶级方法及属性]]> 通常在AS3中会用到一些顶级的方法,他们没有实例化任何对象。如getTimer()、parseFloat( )等等。那么这些方法如何实现的呢?

其实虽然没有使用某个对象来调用,但是他们却引用了某些包。本着执着的精神,于是还是找到了怎么写的法子。

如下一个简单的例子,一个简单的打印语句 只是在其前面加上了前缀

新建一个 as文件 命名为 traceInfo。然后键入下面代码

package
{
public function traceInfo( value:String ):void{
trace( '--'+value );
}
}

同理顶级属性(例如 需要一个游戏版本号,相比而言用静态公共属性与顶级属性的话,顶级的更方便)

package
{ 
   public const VERSION:String = '1.2.0';
}

或者

package
{ 
   public function get VERSION():String
   {
     return '1.2.0';
    }
}

注意:将class包含的全部去掉 只留下构造函数,但是去掉class的构造函数就不是构造函数了,变成了普通的函数,所以还得加上返回值 否则有警告(不加也可,强迫症没法,见不得警告)

另外文件名也必须和这个方法名相同不然会出现报错

 

然后就可以再任何地方使用了。如下图 可以看到 traceInfo 和 trace 都能够在代码提示里面看到

 

 

]]>
http://www.523326.com/?feed=rss2&p=66 0