About

<#TEMPLATE_INCLUDE_NINEPAGE_ABOUTME#>
  • Jan

    20

    AIR 应用程序目前的 File 类在使用browseForSave() 方法时,没有文件扩展名过滤功能(没有 FileFilter 作为过滤列表)。一种替代方法是改成 FileReference 类的sava() 方法来保存数据,因为sava() 方法可以设置默认的保存文件名。但这并不是一个很好的方法,因为用户是可以修改扩展名的。所以可以对 File 类的 browseForSave() 方法可以作一些改进,让它变成有扩展名,并且在保存对话框中无法修改(但它也会有一个缺点,就是用户在保存时是看不到扩展名的,所以也就可以防止用户在保存时修改扩展名)。样例代码如下:

    //导出保存的文件
    var file:File = new File();
     
    try{
     file.browseForSave("保存为");
     file.addEventListener(Event.SELECT, saveData);
    }catch (error:Error){
     trace("保存失败:", error.message);
    }
     
    function saveData(event:Event):void{
     file = event.target as File;
     file.url += ".zfp";//这一步是关键,隐藏添加了扩展名
     var fileStream:FileStream = new FileStream();
     fileStream.open(file, FileMode.WRITE);
     fileStream.writeBytes("这里是要保存的数据");
     fileStream.close();
    }

    Jan

    18

    样例代码:

    var rootElementName:String = "BOOK";
    var rootAttributeName:String = "ISBN";
    var childElementNames:Array = ["TITLE", "AUTHOR", "PUBLISHER"];
    var bookISBN:String = "0141182806";
    var bookTitle:String = "Ulysses";
    var bookAuthor:String = "Joyce, James";
    var bookPublisher:String = "Penguin Books Ltd";
    var novel:XML = <{rootElementName} {rootAttributeName}={bookISBN}>
    <{childElementNames[0]}>{bookTitle}</{childElementNames[0]}>
    <{childElementNames[1]}>{bookAuthor}</{childElementNames[1]}>
    <{childElementNames[2]}>{bookPublisher}</{childElementNames[2]}>
    </{rootElementName}>;

    以上样例代码与以下资料摘自《 Essential ActionScript 3.0 》:

    Note that because the characters { and } are used to delimit a dynamic expression, they are not allowed in some parts of an XML literal. Specifically, within an element name, an attribute name, or element content, the entities &#x7B; and &#x7D; must be used to represent { and }, respectively. However, { and } can be used in literal form within an attribute value, a CDATA section, a processing instruction, or a comment.

    More...

    Jan

    17

    通过 Flex 列表类组件项编辑器与项渲染器的值引用,来实现禁止列表类组件编辑项为空值(以下以 DataGrid 组件为例,同样适用于 List、AdvancedDataGrid 等其它带有项编辑器与项渲染器的组件)。通过 DataGrid  的 DataGridEvent 事件(其它列表类组件该事件名称不同),可获取当前正在被编辑的项编辑器与项渲染器的引用。因为要验证当前项编辑器是否为空,所以需要在 itemEditEnd 事件中验证。

    var _itemEditorInstance:IListItemRenderer = (e.currentTarget as DataGrid).itemEditorInstance;
    var _newData:String = TextInput(_itemEditorInstance).text;
    if(_newData == ""){
     TextInput(_itemEditorInstance).text =  e.currentTarget.editedItemRenderer.text;
    }

    Jan

    16

    如果直接对 DataGridColumn 对象的 itemRenderer 或 itemEditor 属性指定一个类,而没有实现 IFactory 接口,是会报以下错误的:

    1067: Class 类型值的隐式强制指令的目标是非相关类型 mx.core:IFactory。

    定义一个 DataGridColumn 对象:

    private var _1DGC:DataGridColumn = new DataGridColumn("test");

    然后通过 ClassFactory 类生成一个 NumRestrictText 工厂对象(NumRestrictText 类为一个自定义类)。

    _1DGC.itemEditor = new ClassFactory(NumRestrictText);

    Jan

    15

    样例代码主要有以下功能:

    1. 简单继承window类创建MyWindow。加入parentWindow属性以及advOpen()方法, 设置MyWindow默认样式。

    2. 从主程序中弹出窗口1,从窗口1中弹出窗口2。每个窗口里有image和button

    3. 窗口1可以关闭主程序窗口,窗口2可以关闭窗口1。(关闭父窗口)

    DEMO下载:AIRPopupWindowDemo.zip

    转自:http://bbs.airia.cn/Share/thread-2762-1-1.aspx

    Jan

    14

    正则表达式入门教程

    • 0 Comments
    • Flash Platform

    ActionScript3 中 RegExp类允许使用正则表达式,并且为顶级类。在 ActionScript2 中没有内置的正则表达式类,可以使用第三方类来实现

    下载 ActionScript2 版本的第三方类:AS2_RegExp.rar

    正则表达式相关入门教程:http://deerchao.net/tutorials/regex/regex.htm

    Jan

    12

    AIR / FLEX / AS3 裁切图像

    • 0 Comments
    • Flash Platform
    import flash.display.BitmapData;
    import flash.display.DisplayObject;
    import flash.geom.Matrix;
    import flash.geom.Rectangle;
    //inScale为缩放系数
    function cropBitmapData( inDisplayObject:DisplayObject, inWidth:int, inHeight:int, inX:int, inY:int, inScale:Number = 1):BitmapData {
     if (!inDisplayObject) {
      throw new Error('inDisplayObject 显示对象必须在列表上');
      return null;
     }
     var cropArea:Rectangle = new Rectangle( 0, 0, inWidth * inScale, inHeight * inScale);
     var croppedBitmapData:BitmapData = new BitmapData( inWidth * inScale, inHeight * inScale);
     croppedBitmapData.draw(inDisplayObject, new Matrix(inScale, 0, 0, inScale, -inX, -inY), null, null, cropArea, true );
     return croppedBitmapData;
    }

    Jan

    8

    一些做桌面应用程序的开发者可能用的上,比如生成唯一注册码方式很多是通过计算机硬件信息(机器码)生成的,读取网卡的物理地址(MAC地址)就是比较常见的一种(AIR编译配置中需要设置成桌面应用程序)。

    import flash.net.NetworkInfo;
    import flash.net.InterfaceAddress;
    var netWorkVec:Vector.<NetworkInterface >  = NetworkInfo.networkInfo.findInterfaces();
    trace("--------------------------")
    for (var i:* in netWorkVec) {
     trace("网络连接名称:"+netWorkVec[i].displayName);
     trace("MAC网卡地址:"+netWorkVec[i].hardwareAddress);
     var addressVec:Vector.<InterfaceAddress> = new Vector.<InterfaceAddress>();
     addressVec = netWorkVec[0].addresses;
     for (var j:* in addressVec) {
      trace("网络IP地址:"+addressVec[j].address);
     }
     trace("--------------------------")
    }

    Jan

    8

    Adobe AIR 运行时环境并没有提供原生的获取系统文件夹 system32 的方法或属性。一种较简单快捷,但不完美(至少在AIR 3以下版本不完美,也许以后 Adobe 会改进)方法如下。

    它的不完美在于“WINDOWS/system32”是一个字符串常量,如果用户安装系统时,自定义了一个WINDOWS文件夹路径,那么它就无法使用了。

    import flash.filesystem.File;
    var desktopFolder:File = File.desktopDirectory;
    var desktopPath:String = File.desktopDirectory.nativePath;
    var driveLetter:String = desktopPath.substr(0,3);
    desktopFolder = desktopFolder.resolvePath(driveLetter+"WINDOWS/system32");
    trace(desktopFolder.nativePath);

    More...

    Jan

    7

    AIR 文件类型过滤

    • 0 Comments
    • Flash Platform

    主要是browseForOpenMultiple第二个参数的使用,没啥好说的

    import flash.filesystem.*;
    import flash.events.FileListEvent;
    var docsDir:File = File.documentsDirectory;
    var _allFF:FileFilter = new FileFilter("*.bmp;*.jpeg;*.jpg;*.png","*.bmp;*.jpeg;*.jpg;*.png");
    var _bmpFF:FileFilter = new FileFilter("*.bmp","*.bmp");
    var _jpgFF:FileFilter = new FileFilter("*.jpg","*.jpg");
    var _jpegFF:FileFilter = new FileFilter("*.jpeg","*.jpeg");
    var _pngFF:FileFilter = new FileFilter("*.png","*.png");
    try {
     docsDir.browseForOpenMultiple("选择图像文件",[_allFF,_bmpFF,_jpgFF,_jpegFF,_pngFF]);
     docsDir.addEventListener(FileListEvent.SELECT_MULTIPLE, filesSelected);
    } catch (error:Error) {
     trace(error.message);
    }
    function filesSelected(event:FileListEvent):void {
     for (var i:uint = 0; i < event.files.length; i++) {
      trace(event.files[i].nativePath);
     }
    }