正's profile╰. ╯◢㊣阿正星空㊣◣℃㊣51数码㊣PhotosBlogListsMore Tools Help

Blog


    May 07

    转:FlashDevelop在编写as3时需要另外添加的类路径

    By Fanflash

    as3现在并不是把所有的类规整的放在一个目录下,所以我们使用外置编辑环境时,需要在另外配置一下,这样就用属性方法提示了^_^

    如果需要使用TWEEN类,就要添加下面这个路径

    D:\Adobe\Flash cs\Adobe Flash CS3\zh_cn\Configuration\ActionScript 3.0\Classes

    如果要使用大部分的用户组件,就要添加下面这个路径

    D:\Adobe\Flash cs\Adobe Flash CS3\zh_cn\Configuration\Component Source\ActionScript 3.0\User Interface

    如果要使用FLVPlayback组件,就要添加下面这个路径

    D:\Adobe\Flash cs\Adobe Flash CS3\zh_cn\Configuration\Component Source\ActionScript 3.0\FLVPlayback

    如果要使用FLVPlaybackCaptioning,就要添加下面这个路径

    D:\Adobe\Flash cs\Adobe Flash CS3\zh_cn\Configuration\Component Source\ActionScript 3.0\FLVPlaybackCaptioning

     

    FlashDevelop 3 用过几次都是因为配置不成功放弃了!如果能安装就顺利使用就好啦哈哈!

    今天我搞了一下,建立项目是FLADH IDE的,直接使用FLASH CS4,就可以啦!

    可以看到OUTPUT,和报错信息在FLASH DEVELOP 里面了,点击就可以进行修改相关的类文件了!

    没别的要求了,开用呵!

    March 31

    php获取FLASH 发送的二进制位图

    转:草上飞 

    if ( isset ( $GLOBALS["HTTP_RAW_POST_DATA"] )) {
      $im = $GLOBALS["HTTP_RAW_POST_DATA"];
      header('Content-Type: image/jpeg');
      header("Content-Disposition: attachment; filename=".$_GET['name']);
      echo $im; 
    }  else{}


    $GLOBALS["HTTP_RAW_POST_DATA"]

    March 05

    Flash AS3 3D基础

    转正:孤独人生 http://hi.baidu.com/hechubuzai/blog/item/49d516006085ea80e850cd0f.html

        在3D背后最重要的理论就是超出X和Y存在的另一个维度。这是表示深度的维度,通常记为Z。
    首先,需要确定Z是朝哪个方向的:向内或向外。它比普通的坐标系统在某些地方是相反的。Y轴向下,而非向上,角度则是以顺时针方向而定的。而非逆时针方向。
    因此,当物体远离或接近我们的时候,是否应该让物体Z轴上位置增加?没有必要去比较哪个更正确。事实上,这个课题已经被讨论许久了,人们甚至为了描述这两种方法分别给它们取了名字:左手系统和右手系统。
    伸出你的右手,让拇指与食指构成一个L形,然后将中指弯曲90度,每个手指都将指向一个维度。现在,将你的食指指向X轴的下半轴,中指指向Y轴的正半轴。在右手坐标系中,拇指的指向就是Z轴的正半轴方向。对于Flash而言,意味着物体远离观察者时Z轴将增大,临近观察者时Z轴将减小。如果我们用左手来试的话,得到的结果则是相反的。
    透视法是指如何表述物体接近或远离我们时的方法。换句话讲,如何让物体看起来更近或更远。一幅美术作品中可能有大量的表现透视的技巧,这里我们只关注两点:
       当物体离得远时,会变小。
       当物体远离时,它们会聚集到一个消失点上。
    大家肯定见过火车驶向地平线时的景象。当我们在Z轴上移动物体时,需要做两件事:
       增大或减小物体的比率。
       让物体接近或远离消失点。
    在二维系统中,我们可以使用屏幕的X和Y坐标作为物体的X和Y坐标。只需要一对一地映射过来即可。但是在3D系统中就行不通了,因为两个物体可以有相同的 X,Y坐标,由于它们的深度不同,会使它们在屏幕上有不同的位置。因此,在3D空间中移动每个物体都需要知道它们各自的X,Y,Z坐标,这是屏幕坐标不能做到的。
    让物体的距离更远,基本思想是让它的缩放比率接近0,让它们的X,Y坐标集中到消失点的0,0处。幸好,缩放的比率与汇集的比率相同。因此,我们只需要根据给定的距离计算出这个比率,然后在这两个地方使用它即可。
    我们距离对象有一段距离。有一个观察点:眼睛。有一个成象面,可以想象成电脑的屏幕。对象与成象面之间有一段距离,这就是Z的值。最后,距离观察点到万象面还有一段距离。最后这点最为重要。虽然这段距离不完全等同于摄像机的焦距,但是与它基本相似,因此我们通常用变量fl[焦距:focal length]表示。下面是这个公式:
       scale=fl/(fl+z)
    scale值通常是介于0.0到1.0之间的,这就是缩放和汇聚到消失点上的比率。然后,当Z变为负数时,fl+z接近0而缩放比例接近无穷大。
    拿到这个scale的值能做些什么呢?假设在处理一个影片,我们将这个值赋给影片的scaleX和scaleY。然后再用这个因数乘以物体的x,y坐标,就可以算出物体在屏幕上的X,Y的位置。
    看一个例子。通常情况下fl的值在200到300之间。我们选用250这个值。如果Z等于0--换句话讲,物体就在成象面上--那么scale就等于 250/(250+0)。结果等于1.0。这就是scaleX和scaleY的值。让物体的x,y坐标乘以1.0,返回的结果不变,因此物体在屏幕上的位置就等于它自身的X和Y。
    现在将物体向外移让Z等于250。则让scale等于250/(250+250),scaleX和scaleY等于0.5。同样也改变了物体在屏幕上的位置。如果原来物体在屏幕上的位置是200,300那么现在就应该是100,150。因此,它向着消失点移动了一半的距离。

    下面是一个透视示例:
    package {
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.events.KeyboardEvent;
    import flash.ui.Keyboard;
    public class Trees extends Sprite{
       private var trees:Array;
       private var numTrees:uint=100;
       private var fl:Number=250;
       private var vpX:Number=stage.stageWidth/2;
       private var vpY:Number=stage.stageHeight/2;
       private var floor:Number=50;
       private var ax:Number=0;
       private var ay:Number=0;
       private var az:Number=0;
       private var vx:Number=0;
       private var vy:Number=0;
       private var vz:Number=0;
       private var gravity:Number=0.3;
       private var friction:Number=0.98;
       private var rota:Number=0;
       public function Trees(){
        init();
       }
       private function init():void{
        trees=new Array();
        for(var i:uint=0;i<numTrees;i++){
         var tree:Tree=new Tree();
         trees.push(tree);
         tree.xpos=Math.random()*5000-100;
         tree.ypos=floor;
         tree.zpos=Math.random()*5000;
         addChild(tree);
        }
        addEventListener(Event.ENTER_FRAME,onEnterFrame);
        stage.addEventListener(KeyboardEvent.KEY_DOWN,onKeydown);
        stage.addEventListener(KeyboardEvent.KEY_UP,onKeyup);
       }
       private function onEnterFrame(e:Event):void{
        vx+=ax;
        vy+=ay;
        vz+=az;
        vy-=gravity;
        for(var i:uint=0;i<numTrees;i++){
         var tree:Tree=trees[i];
         move(tree);
         rotateY(tree,rota);
         doPerspective(tree);
        }
        vx*=friction;
        vy*=friction;
        vz*=friction;
        sortZ();
       }
       private function onKeydown(e:KeyboardEvent):void{
        switch(e.keyCode){
         case Keyboard.UP:
         az=-1;
         break;
         case Keyboard.DOWN:
         az=1;
         break;
         case Keyboard.LEFT:
         ax=1;
         break;
         case Keyboard.RIGHT:
         ax=-1;
         break;
         case Keyboard.SPACE:
         ay=1;
         break;
         case Keyboard.SHIFT:
         rota=0.01;
         break;
         case Keyboard.CONTROL:
         rota=-0.01;
         break;
         default:
         break;
        }
       }
       private function onKeyup(e:KeyboardEvent):void{
        switch(e.keyCode){
         case Keyboard.UP:
         case Keyboard.DOWN:
         az=0;
         break;
         case Keyboard.LEFT:
         case Keyboard.RIGHT:
         ax=0;
         break;
         case Keyboard.SPACE:
         ay=0;
         break;
         case Keyboard.SHIFT:
         case Keyboard.CONTROL:
         rota=0;
         break;
         default:
         break;
        }
       }
       private function rotateY(ball:Tree,angleY:Number):void{
        var cosY:Number=Math.cos(angleY);
        var sinY:Number=Math.sin(angleY);
        var x1:Number=ball.xpos*cosY-ball.zpos*sinY;
        var z1:Number=ball.zpos*cosY+ball.xpos*sinY;
        ball.xpos=x1;
        ball.zpos=z1;
       }
       private function rotateX(ball:Tree,angleX:Number):void{
        var cosX:Number=Math.cos(angleX);
        var sinX:Number=Math.sin(angleX);
        var y1:Number=ball.ypos*cosX-ball.zpos*sinX;
        var z1:Number=ball.zpos*cosX+ball.ypos*sinX;
        ball.ypos=y1;
        ball.zpos=z1;
       }
       private function doPerspective(ball:Tree):void{
        if(ball.zpos>-fl){
         var scale:Number=fl/(fl+ball.zpos);
         ball.scaleX=ball.scaleY=scale;
         ball.x=vpX+ball.xpos*scale;
         ball.y=vpY+ball.ypos*scale;
         ball.visible=true;
        }else {
         ball.visible=false;
        }
       }
       private function move(tree:Tree):void{
        tree.xpos+=vx;
        tree.ypos+=vy;
        tree.zpos+=vz;
        if(tree.ypos<floor){
         tree.ypos=floor;
        }
        if(tree.zpos<-fl){
         tree.zpos+=5000;
        }
        if(tree.zpos>5000-fl){
         tree.zpos-=5000;
        }
       }
       private function sortZ():void{
        trees.sortOn("zpos",Array.DESCENDING|Array.NUMERIC);
        for(var i:uint=0;i<numTrees;i++){
         var tree:Tree=trees[i];
         setChildIndex(tree,i);
        }
       }
    }
    }

    本章主要公式:
    基本透视法:
       scale=fl/(fl+zpos);
       sprite.scaleX=sprite.scaleY=scale;
       sprite.alpha=scale;
       sprite.x=vanishingPointX+xpos*scale;
       sprite.y=vanishingPointY+ypos*scale;
    Z排序:
       objectArray.sortOn("zpos",Array.DESCENDING|Array.NUMERIC);
       for(var i:uint=0;i<numObjects;i++){
        setChildIndex(objectArray[i],i);
       }
    坐标旋转:
       x1=cos(angleZ)*xpos-sin(angleZ)*ypos;
       y1=cos(angleZ)*ypos+sin(angleZ)*xpos;
       x1=cos(angleY)*xpos-sin(angleY)*zpos;
       z1=cos(angleY)*zpos+sin(angleY)*xpos;
       y1=cos(angleX)*ypos-sin(angleX)*zpos;
       z1=cos(angleX)*zpos-sin(angleX)*ypos;
    距离:
       dist=Math.sqrt(dx*dx+dy*dy+dz*dz);

    February 26

    as3 if ()后加个;分号的结果

    as3 if ()后加个;分号的结果

    会导制IF失效,怎么判断都会通过,这种问题FLEX是不报错的,所以。。。。付出了N多时间

    February 16

    关于“5005: 优化字节代码时发生未知错误。”的处理办法

     

    by fanflash

    这问题还是剑心大哥先发现的,当然解决方法也是他找到的,幸苦他了,我昨天也碰到这个问了,作为后来者,我轻松的站在了巨人的肩膀上,拿走了他的劳动果食,哈哈,下面贴出解决:

    右击我的电脑-》属性-》高级-》环境变量(是个按钮,在最下面)

    然后在系统变量那新建一个变量:

    变量名:JAVA_TOOL_OPTIONS

    值:-Xmx256M

    ---------------------

    值前面是有“-”号的,256表示虚拟内存的大小,当然,你可以把他再调整大点,越大,FLASH编译的速度会越快,但设置大了有时会出错,不同的机子情况不一样。

    February 02

    actionscript3.0 图片裁剪及保存jpg详解

    转:hereson

    1. 客户端生成BitmapData 对象。
    2. 用JPGEncoder 对其编码相应的字节数组
    3 用URLRequest和URLLoader发送数据。
    4.服务用request.getInputStream()接收流..
    5.保存为图片格式。
    package
    ...{
        import flash.geom.Point;
        import flash.geom.Rectangle;
        import flash.net.URLLoader;
        import flash.net.URLRequest;
        import flash.events.* ;
        import flash.display.*;
        import flash.geom.* ;
        import flash.net.*;
        import flash.utils.ByteArray;
        import com.wdxc.util.* ;  
        public class Main extends Sprite
        ...{
            private var _picx:int = 0 ;
            private var _picy:int = 120 ; 
            private var _picwidth = 0 ;
            private var _picheight = 0 ;
            private var _bitmapdata:BitmapData ;
            private var _rect:Sprite ;//裁剪区域    
            private var _url:String ="http://192.168.0.211/test.jsp";
            public function Main():void...{    
                this.loadPic("F:\a.jpg"); 
                this.init();
            }     
            public function init():void ...{
                cut_btn.addEventListener(MouseEvent.MOUSE_DOWN, grabPic);
                save_btn.addEventListener(MouseEvent.MOUSE_DOWN, savePic) ;
            }
            /** *//****
             * 装载图片
             * @param    picurl 
             */  
            public function loadPic(picurl:String):void...{
                if (picurl == null || picurl == "")
                ...{
                    return ;   
                }
                var request:URLRequest = new URLRequest(picurl);
                var loader:Loader = new Loader() ;
                loader.load(request);
                loader.contentLoaderInfo.addEventListener(Event.COMPLETE, completeHander);
            }
            /** *//** 
             * 对图片编码并提交给服务端保存。
             * @param bitmapdata 图片数据 
             */      
            public function submit(bitmapdata:BitmapData):void ...{
                //每次URL不同,AS3才会提交每一次,否则将不提交。
                var url :String = _url+"?"+Math.floor(Math.random()*1000) ; 
                var request:URLRequest = new URLRequest(url); 
                //编码成图片格式流
                var encoder:JPGEncoder = new JPGEncoder(80);
                var bytes:ByteArray = encoder.encode(bitmapdata);     
                request.method = URLRequestMethod.POST;
                request.data = bytes ;  
                //设置成文件流形式
                request.contentType = "application/octet-stream";
                var loader:URLLoader = new URLLoader();                 
                loader.load(request) ;       
                loader.addEventListener(Event.COMPLETE, sendCompleteHandler) ; 
            }
            /** *//**
             * 服务端保存完回调
             * @param    e
             */
            private function sendCompleteHandler(e:Event):void ...{
                trace("save success........");    
            } 
            /** *//**
             * 保存裁剪图片
             * @param    e
             */
            private function savePic(e:MouseEvent)...{
                //组装要裁剪区域   
                var cutpic:Rectangle = new Rectangle(_rect.x,_rect.y,_rect.width,_rect.height);
                var bitmapdata:BitmapData = this.getCutData(_bitmapdata, cutpic); 
                var bitmap:Bitmap = new Bitmap(bitmapdata) ;          
                bitmap.x = 100 ;
                bitmap.y = 0 ; 
                //只显示裁剪区域图片,去除其他空位置 
                this.addChild(bitmap);   
                this.submit(cutbitmapdata);      
            }  
            /** *//**  
             * 获取所裁剪区域的数据。所有像素信息
             * @param source        源图数据  
             * @param rect          所有裁剪的区域    
             * @return BitmapData   裁剪出新图的数据
             */
            public function getCutData(source:BitmapData,rect:Rectangle):BitmapData ...{
                //存放裁剪出的新图片
                var cutbitmapdata:BitmapData = new BitmapData(Math.floor(_rect.width),Math.ceil(_rect.height)) ;
                //坐标转化,把坐标移到裁剪区域的位置,宽度和高度在cutbitmapdata里指定。
                var matrix:Matrix = new Matrix(1, 0, 0, 1, -Math.floor(_rect.x), -Math.floor(_rect.y));
                cutbitmapdata.draw(_bitmapdata, matrix); 
                return cutbitmapdata ; 
            }
            /** *//**** 
             * 装载图片完成之后,显示图片到场景
             * @param    e
             */
            private function completeHander(e:Event):void ...{
                var loader:Loader = e.target.loader as Loader;
                this._picwidth = loader.width ;
                this._picheight = loader.height ;     
                _bitmapdata= new BitmapData(loader.width, loader.height);
                _bitmapdata.draw(loader);
                var _bitmap:Bitmap = new Bitmap(_bitmapdata);       
                _bitmap.x = this._picx;
                _bitmap.y = this._picy ;
                this.addChild(_bitmap);
            }
            /** *//****     
             * 生成裁剪区域框,用来抓起图片
             * @param    e    
             */   
            private function grabPic(e:MouseEvent):void
            ...{
                _rect= new Sprite () ;
                /** *//***设置裁剪区域边框样式*/
                _rect.graphics.lineStyle(3, 0xFF0000, 0.5, true, LineScaleMode.NONE, CapsStyle.ROUND);
                _rect.graphics.beginFill(0xCCFF00,0);  
                _rect.graphics.drawRect(this._picx, this._picy, this._picwidth/4,this._picheight/4);
                _rect.graphics.endFill(); 
                _rect.addEventListener(MouseEvent.MOUSE_DOWN, mouseDownHandler) ;
                _rect.addEventListener(MouseEvent.MOUSE_UP, mouseUpHandle) ;
                this.addChild(_rect) ;        
            }
            /** *//**
             * 鼠标控制裁剪区域,可拖动,拉伸。
             * @param    e
             */
            private function mouseDownHandler(e:MouseEvent):void ...{
                //裁剪区域移动范围,不能超过原图区域。
                var _rectangle:Rectangle = new Rectangle();
                _rectangle.width = _picwidth-_rect.width ;
                _rectangle.height = _picheight-_rect.height ;      
                _rect.startDrag(false,_rectangle);            
            }
            private function mouseUpHandle(e:MouseEvent):void ...{
                _rect.stopDrag();
            }
        }
    }
    服务端处理代码
    <%
        String filePath = request.getRealPath(System.currentTimeMillis()+".jpg");
        System.out.print("filepath=="+filePath);
        BufferedInputStream inputStream = new BufferedInputStream(request.getInputStream());
        FileOutputStream outputStream = new FileOutputStream(new File(filePath));
        byte [] bytes = new byte[1024];
        int v;
        while((v=inputStream.read(bytes))>0){
            outputStream.write(bytes,0,v);
        }
        outputStream.close();
        inputStream.close();
    %>

    September 11

    关于Flex及AS3的百多条小小知识

    转至  脚本之家(www.jb51.net)

    【改变输出swf的尺度,背景颜色或帧频】
    在"Navigator"窗框里右键你的项目>选中"Properties">选中"ActionScript Compiler">在"Additional compiler arguments"里输入你所需要的命令
    如想改变背景颜色,请输入: -default-background-color 0xffffff
    【鼠标坐标】
    mouseX mouseY
    【检查变量类型并返回布尔值】
    is
    【检查变量类型并返回类型】
    typeof
    【检查对象类型并返回该对象】
    as
    【是数字但不是有效数字问题】
    var quantity:Number = 15 - "rabbits";
    trace(typeof quantity); //显示: "number" , 但它是NaN (not a number)
    trace(quantity is Number); //true
    trace(quantity != NaN); //false
    //使用isNaN()函数检测:
    isNaN(quantity); //true
    //检测变量是否内含有效数字:
    !isNaN(quantity); //false
    【取消默认的严格编译模式】
    在"Navigator"窗框里右键你的项目>选中"Properties">选中"ActionScript Compiler">取消"Enabel compile-time type checking"选项
    【基元数据类型和复杂数据类型好比"值类型"和"引用类型"】
    基元数据类型类似按值传递:
    var intOne:int = 1;
    var intTwo:int = 1;
    trace(intOne == intTwo); //true
    【复杂数据类型类似按引用传递】
    var arrayOne:Array = new Array("a", "b");
    var arrayTwo:Array = arrayOne;
    trace(arrayOne == arrayTwo); //true
    //-----------------------------------
    var arrayOne:Array = new Array("a", "b");
    var arrayTwo:Array = new Array("a", "b");
    trace(arrayOne == arrayTwo); //false
    【优化逻辑AND(&&)和OR(||)的小知识】
    对于逻辑And(&&):
        除非条件表达式的前半部分为真,否则,ActionScript不会再去求算逻辑AND运算符的后半部.如果前半部为假,整个条件表达式一定为假,所以再去求算后半部就没效率了.
    对于逻辑OR(||):
        除非条件表达式前半部为假,否则,ActionScript不会再去求算逻辑OR运算符的后半部,如果前半部为真,整个条件表达式一定为真.
    总结:使用逻辑AND(&&)时,把结果最可能为false的表达式放到前面;使用逻辑OR(||)时,把结果最可能为true的表达式放到前面.
    【Timer类注意事项】
    不要认为Timer可以极其准确;使用Timer时间间隔不要低于10毫秒.
    【private,protected,internal,public访问权限】
    private:只能在类本身内部访问,按惯例,命名私有成员时以下划线"_"开头;
    protected:可以由类本身或任何子类访问.但这是以实例为基础的.换言之,类实例可以访问自己的保护成员或者父类的保护成员,但不能访问相同类的其它实例的保护成员,按惯例,命名保护成员时以下划线"_"开头;
    internal:可以由类本身或者相同包内的任何类访问;
    public:可以在类内部访问,也可以由类实例访问,或者声明为static时,可以直接从类访问.
    【一个函数具有未知个数的参数,用arguments对象或"...(rest)"符号访问它的参数】
    注意:使用"...(rest)"参数会使 arguments 对象不可用;
    private funciton average():void{
        trace(arguments.length); //输出参数的个数
        // arguments的类型是:object,但可以像访问数组一样去访问它
        trace(arguments[1]); //输出第二个参数
    }
    private function average(...argu):void{
        trace(argu[1]); //输出第二个参数,argu参数名是自定义的.
    }
    【错误处理try,catch,finally】
    private function tryError():void{
        try {
            trace("测试开始-try");
            throwError();
        }catch(errObject:Error) {
            trace("错误信息:" + errObject.message);
            trace("测试结束-catch");
            return;
        }finally{
            trace("虽然catch里已经有return方法,但位于return方法后面的finally里的代码依然会被执行.其实无论return方法是在try里,还是catch里,finally里的代码始终会被执行");
        }
        trace("前面已经有return了,此处是不会再执行的.除非没有抛出错误,以使catch里的代码没有被执行");
    }
    private function throwError():void{
        throw new Error("抛出错误");
    }
    【for...in与for each...in的区别】
    与for...in循环不同的是,for each...in循环中的迭代变量包含属性所保存的值,而不包含属性的名称(或主键,索引).
    【命名包路径的小技巧】
        使用相应于拥有者和相关项目的包名称会比较好.按惯例来讲,包名称的开头应该是逆向的网址名称.例如,如果Example Corp(examplecorp.com)写了一些ActionScript3.0类,就会把所有类放在com.examplecorp包内(或者 com.examplecorp的子包内).如此一来,如果英国有另一家Example Corp(examplecorp.co.uk)也写了一些ActionScript3.0类,只要使用包uk.co.examplecorp,就可确保 唯一性.
        当类属于特定应用程序的一部分时,就应该放在该应用程序特定的子包内.例如,Example Corp可能有个应用程序名叫WidgetStore.如果WidgetStore应用程序使用一个名为ApplicationManager的类,则此 类就应该放在com.examplecorp.widgetstore包内,或者位于该包的子包内.
        按惯例来说,包名称的开头是小写字母.
    【隐式的取出方法(getter)和设定方法(setter)】
    public function get count():uint {
        return _count;
    }
    public function set count(value:uint):uint {
        if(value < 100){
            _count = value;
        }else {
            throw Error();
        }
    }
    【确保类是绝不会有子类,使用final】
    final public class Example{}
    【super关键字的使用】
    super(); //父类的构造函数,只能在类实例构造函数内部使用
    super.propertyName; //调用父类的属性,属性需要声明为public或protected
    super.methodName(); //调用父类的方法,方法需要声明为public或protected
    【建立常数,使用关键字const而不是var】
    static public const EXAMPLE:String = "example";
    【检测播放器版本】
    flash.system.Capabilities.version
    对于8.5版以前的任何Flash Player版本,这种方法都不适用.
    【判断客户端系统】
    flash.system.Capabilities.os
    【检测播放器类型】
    flash.system.Capabilities.playerType
    可能的值有:
    "StandAlone",用于独立的 Flash Player
    "External",用于外部的 Flash Player 或处于测试模式下
    "PlugIn",用于 Flash Player 浏览器插件
    "ActiveX",用于 Microsoft Internet Explorer 使用的 Flash Player ActiveX 控件
    【检测系统语言】
    flash.system.Capabilities.language
    【判断用户是否启用了IME(输入法编辑器)】
    flash.system.IME.enabled
    【检测屏幕的分辨率】
    flash.system.Capabilities.screenResolutionX
    flash.system.Capabilities.screenResolutionY
    【把弹出窗口居中的算法】
    X = (舞台宽/2)-(窗口宽/2)
    Y = (舞台高/2)-(窗口高/2)
    【控制影片配合Player的方式,包括缩放问题】
    stage.scaleMode
    可供选择值:flash.display.StageScaleMode
    【舞台的对齐方式】
    stage.align
    可供选择值:flash.display.StageAlign
    【隐藏Flash Player的右键菜单】
    stage.showDefaultContextMenu = false;
    【检测系统是否具有音频功能】
    flash.system.Capabilities.hasAudio
    【检测播放器是在具有MP3解码器的系统上运行,还是在没有MP3解码器的系统上运行】
    flash.system.Capabilities.hasMP3
    【检测播放器能 (true) 还是不能 (false) 播放流式视频】
    flash.system.Capabilities.hasStreamingVideo
    【检测播放器是在支持 (true) 嵌入视频的系统上运行,还是在不支持 (false) 嵌入视频的系统上运行】
    flash.system.Capabilities.hasEmbeddedVideo
    【检测播放器能 (true) 还是不能 (false) 对视频流(如来自 Web 摄像头的视频流)进行编码】
    flash.system.Capabilities.hasVideoEncoder
    【显示 Flash Player 中的"安全设置"面板】
    flash.system.Security.showSettings();
    可供选择项:flash.system.SecurityPanel
    【让其它域的.swf访问本域的.swf】
    在本域的.swf文件里加上:flash.system.Security.allowDomain()
    或者使用安全策略文件"crossdomain.xml".在Flash 8以前,这个文件必须放在.swf所在域的根目录,现在,你可以使用flash.system.Security.loadPolicyFile(),指 定安全策略文件所在的位置.拒绝任何域的做法是在<cross-domain-policy>标签内什么也不填,安全策略文件也支持通用字符 "*":
    <?xml version="1.0"?>
    <!-- http://www.mydomain.com/crossdomain.xml -->
    <cross-domain-policy>
        <allow-access-from domain="www.riahome.cn" />
        <allow-access-from domain="*.Y-boy.cn" />
        <allow-access-from domain="210.38.196.48" />
        <allow-access-from domain="*" />
    </cross-domain-policy>
    【数字的不同进制之间的转换】
    parseInt(str:String, radix:uint = 0):Number 返回十进制的数,参数radix表示要分析的数字的基数.如果省略radix,就默认为10,除非字符串的开头是"0x","0X"或"0":
    trace(parseInt("0x12")); //设定radix为16,输出:18
    trace(parseInt("017")); //设定radix为8,输出:15
    或者使用Number,uint和int对象的toString(radix)方法.
    【使用Math.round()对一个数取整,四舍五入】
    Math.round()
    trace(Math.round(204.499)); //输出:204
    trace(Math.round(401.5)); //输出:402
    【使用Math.floor()对一个数向下取整,就是只要整数部分而不理会小数分】
    trace(Math.floor(204.99)); //输出:204
    【使用Math.ceil()对一个数向上取整,只要小数部分不为零,整数部分就加1】
    trace(Math.ceil(401.01)); //输出:402
    【产生一个随机数】
    使用Math.random()产生一个伪随机数n,其中 0 <= n < 1
    【把数字取至最近的小数点位,即指定精确度】
    1. 决定你要取的数字的小数点位数:例如,如果你想把90.337取成90.34,就表示你要取到两位小数点位,也就是说你想取至最近的0.01;
    2. 让输入值除以步骤1所选的数字(此例为0.01);
    3. 使用Math.round()把步骤2所计得的值取成最近的整数;
    4. 把步骤3所得的结果乘以步骤2用于除法的那个值.
    例如,要把90.337取成两个小数点位数,可以使用:
    trace(Math.round(90.337/0.01)*0.01); //输出:90.34
    【把数字取成一个整数的最接近倍数值】
    例1,这样会把92.5取成5的最近倍数值:
    trace(Math.round(92.5/5)*5); //输出:95
    例2,这样会把92.5取成10的最近倍数值:
    trace(Math.round(92.5/10)*10); //输出:90
    【在指定数值范围内获得随机数】
    //可取范围:[min, max]
    private function randRange(min:Number, max:Number):Number {
        var randomNum:Number = Math.floor(Math.random() * (max - min + 1)) + min;
        return randomNum;
    }
    应用例子:
    模拟投银币,即希望得到随机布尔值(true 或 false): randRange(0, 1);
    模拟投骰子,即希望得到随机六个值: randRange(1, 6);
    为避免被缓存而需要产生一个独一无二的数字追加在URL尾端,通常最佳方法是取得当前毫秒数.
    【弧度(radian)与度数(degree)之间的转换】
    从弧度转为度数: degrees = radians * 180 / Math.PI
    从度数转为弧度: radians = degrees * Math.PI / 180
    【计算两点之间的距离】
    勾股定理: c2 = a2 + b2
    假设有两个影片剪辑mc1和mc2,则它们两点间的距离c为:
    var c:Number = Math.sqrt(Math.pow(mc1.x - mc2.x, 2) + Math.pow(mc1.y - mc2.y, 2));
    【模拟圆周运动】
    已知圆心o(x0, y0),半径r和弧度angle,求圆上任意一点P(x, y)的坐标:
    x = x0 + (Math.cos(angle) * r);
    y = y0 + (Math.sin(angle) * r);
    注意:舞台的x轴正方向水平向右,y轴正方向垂直向下.
    【模拟椭圆运动】
    已知圆心o(x0, y0),长轴a,短轴b以及弧度angle,求圆上任意一点P(x, y)的坐标:
    x = x0 + (Math.cos(angle) * a);
    y = y0 + (Math.sin(angle) * b);

    【华氏温度和摄氏温度之间的转换】
    华氏温度 = 摄氏度数 * 9 / 5 + 32
    摄氏温度 = (华氏度数 - 32) * 5 /9
    【公斤与磅之间的转换】
    公斤 = 磅 * 2.2
    磅 = 公斤 / 2.2
    【向数组尾端添加元素】
    var array:Array = new Array();
    array.push("a", "b");
    //向数组尾端添加单一元素也可以这样:
    array[array.length] = "c";
    //如果以索引设定的元素不存在,数组本身会自动扩展以包含足够的元素数目.介于中间的元素会被设为undefined:
    array[5] = "e";
    trace(array[4]); //输出: undefined
    【向数组开端添加元素】
    var array:Array = ["a", "b"];
    array.unshift("c", "d");
    trace(array); //输出: c,d,a,b
    【删除数组中第一个元素并返回该元素,使用shift()方法】
    var letters:Array = new Array("a", "b", "c");
    var firstLetter:String = letters.shift();
    trace(letters); //输出: b,c
    trace(firstLetter); //输出: a
    【删除数组中最后一个元素并返回该元素的值,使用pop()方法】
    var letters:Array = new Array("a", "b", "c");
    trace(letters); //输出: a,b,c
    var letter:String = letters.pop();
    trace(letters); //输出: a,b
    trace(letter); //输出: c
    【删除数组中的元素,给数组添加新元素并返回删除的元素,使用splice()方法】
    splice(startIndex:int, deleteCount:uint, ... values):Array
    startIndex: 一个整数,它指定数组中开始进行插入或删除的位置处的元素的索引;
    deleteCount: 一个整数,它指定要删除的元素数量;
    ... values: 用逗号分隔的一个或多个值的可选列表或数组,此列表或数组将插入到此数组中由 startIndex 参数指定的位置.
    【查找数组中第一个相匹配的元素】
    var array:Array = ["a", "b", "c", "d", "a", "b", "c", "d"];
    var match:String = "b";
    for(var i:int = 0; i < array.length; i++) {
        if(array[i] == match) {
            trace("Element with index " + i + " found to match " + match);
            //输出: Element with index 1 found to match b
            break;
        }
    }
    【查找数组中最后一个相匹配的元素】
    var array:Array = ["a", "b", "c", "d", "a", "b", "c", "d"];
    var match:String = "b";
    for(var i:int = array.length - 1; i >= 0; i--) {
        if(array[i] == match) {
            trace("Element with index " + i + " found to match " + match);
            //输出: Element with index 5 found to match b
            break;
        }
    }
    【把字符串转成数组】
    使用String.split()方法:
    var list:String = "I am YoungBoy.";
    var words:Array = list.split(" "); //以空格作为分隔符将字符串切割
    trace(words); //输出: I,am,YoungBoy.
    【把数组转成字符串】
    使用String.join()方法:
    var myArr:Array = new Array("one", "two", "three");
    var myStr:String = myArr.join(" and ");
    trace(myArr); //输出: one,two,three
    trace(myStr); //输出: one and two and three
    【使用对象数组处理相关数据】
    var cars:Array = new Array();
    cars.push({make:"Mike", year:1997, color:"blue"});
    cars.push({make:"Kelly", year:1986, color:"red"});
    for(var i:int = 0; i < cars.length; i++) {
        trace(cars[i].make + " - " + cars[i].year + " - " + cars[i].color);
    }
    //输出:
    //     Mike - 1997 - blue
    //     Kelly - 1986 - red
    【在数组中获取最小或最大值】
    var scores:Array = [10, 4, 15, 8];
    scores.sort(Array.NUMERIC);
    trace("Minimum: " + scores[0]);
    trace("Maximum: " + scores[scores.length - 1]);
    【使用for ... in语句读取关联数组元素】
    var myObject:Object = new Object();
    myObject.name = "YoungBoy";
    myObject.age = 20;
    for(var i:String in myObject) {
        trace(i + ": " + myObject[i]);
    }
    //输出: name: YoungBoy
    //      age: 20
    注意: for ... in循环不会显示对象所有的内建属性.例如,循环会显示执行期间新增的特殊属性,但是,不会列出内建对象的方法,即使都是储存在对象属性内.
    【AVM(ActionScript Virtual Machine,虚拟机)和渲染引擎(Rendering Engine)】
    AVM负责执行ActionScript程序,而渲染引擎则是把对象绘制在显示器上.
    【指出容器的显示清单中有多少显示对象】
    每个容器都有numChildren属性.
    【把项目新增至显示清单】
    addChild(child:DisplayObject)
    addChildAt(child:DisplayObject, index:int)
    index: 添加该子项的索引位置.如果指定当前占用的索引位置,则该位置以及所有更高位置上的子对象会在子级列表中上移一个位置.
    【从显示清单中移除项目】
    removeChild(child:DisplayObject)
    removeChildAt(index:int)
    index: 要删除的 DisplayObject 的子索引,该子项之上的任何显示对象的索引位置都减去1.
    如果想移除窗口所有子元件,可以结合removeChildAt(),numChildren属性以及for循环.因为每次一个子元件被移除时,索引位置都会变化,所以,有两种方法可以处理所有子元件的移除:
    1. 总是移除位置0的子元件;
    2. 倒过来移除子元件,也就是从尾端开始.
    【更改现有子项在显示对象容器中的位置】
    setChildIndex(child:DisplayObject, index:int):void
    可能用到的方法:
    返回 DisplayObject 的 child 实例的索引位置: getChildIndex(child:DisplayObject):int
    返回位于指定索引处的子显示对象实例: getChildAt(index:int):DisplayObject
    注意: 当子元件移到低于它现在所在位置的索引时,那么,从标的索引起,直到子元件索引前面的那个索引的所有子元件都会令其索引增加1,而该子元件就会指定至标的 索引.当子元件移到较高索引时,从该子元件索引之上的那个索引起,直到标的索引的所有子元件都会令其索引往下减1,而该子元件就会指定至标的索引值.
    【关于TextField以垂直方式把文字摆在按钮表面中心点的小技巧】
    textField.y = (_height - textField.textHeight) / 2;
    textField.y -= 2; //减2个像素以调整偏移量
    【外部.swf影片载入和互动】
    1. 监听init事件;
    2. 透过content属性存取所载入的影片.
    当所载入的影片做好足够的初始化工作,使其方法和属性可以接受互动时,init事件就会被发起.只有在载入器发起init事件后,才能控制影片.所载入的影片还没初始化就试着与它互动,是会产生执行期间错误的.
    _loader.contentLoaderInfo.addEventListener(Event.INIT, handleInit); //当载入的.swf的属性和方法可用时
    _loader.load(new URLRequest("ExternalMovie.swf"));
    private function handleInit(event:Event):void {
        var movie:* = _loader.content;
        trace(movie.getColor());
        movie.setColor(0xFF0000);
    }
    【TextField有两种类型:动态(dynamic)和输入(input),默认值为动态.改变TextField类型方法】
    field.type = TextFieldType.INPUT; //selectable属性默认值为true
    flash.text.TextFieldType.INPUT和flash.text.TextFieldType.DYNAMIC
    【过滤文字输入】
    TextField.restrict = "此处为可输入的内容";
    field.restrict = "^此处为禁止输入的内容";
    restrict属性支持一些类似正则表达式的样式:
    field.restrict = "a-zA-z"; //只允许大小字母
    field.restrict = "a-zA-z "; //只允许字母和空格
    field.restrict = "0-9"; //只允许数字
    field.restrict = "^abcdefg"; //除了小写字母abcdefg不允许外,其它都允许
    field.restrict = "^a-z"; //所有小写字母都不允许,但是,其它内容都允许,包括大写字母
    field.restrict = "0-9^5"; //只允许数字,但5例外
    让restrict字符包含具有特殊意义的字母(例如-和^):
    field.restrict = "0-9\\-"; //允许数字和破折号
    field.restrict = "0-9\\^"; //允许数字和^
    field.restrict = "0-9\\\\"; //允许数字和反斜杠
    你也可以使用Unicode转义序列,指定允许的内容.例如:
    field.restrict = "^\u001A";
    注意:ActionScript有区分大小写的,如果restrict属性设为abc,允许字母的大写形式(A,B和C)输入时会变成小写对待形式(a,b和c),反之亦然.restrict属性只影响用户可以输入的内容,脚本可将任何文本放入文本字段中.
    【设定输入框的最大长度】
    TextField.maxChars:int
    【向TextField追加内容】
    TextField.appendText(text:String):void
    与通过对 text 属性使用加法赋值来连接两个字符串(例如 field.text += moreText)相比,此方法的效率更高.
    【显示HTML格式的文字】
    TextField.htmlText = "<b>Html text</b>";
    支持的HTML标签集有: <b>,<i>,<u>,<font>(有face,size以及color属性),< p>,<br>,<a>,<li>,<img>以及<textformat>(有 leftmargin,rightmargin,blockindent,indent,leading以及tabstops属性,相应于 TextFormat类的同名属性)
    【缩减空白】
    TextField.condenseWhite = true;
    删除具有HTML文本的文本字段中的额外空白(空格,换行符等),如同多数HTML浏览器所做的那样.
    注意: 在设置 htmlText 属性之前设置 condenseWhite 属性
    【自动大小调整和对齐】
    TextField.autoSize = TextFieldAutoSize.LEFT;
    可选之值:
    flash.text.TextFieldAutoSize.CENTER
    flash.text.TextFieldAutoSize.LEFT
    flash.text.TextFieldAutoSize.NONE
    flash.text.TextFieldAutoSize.RIGHT
    【指示文本字段是否自动换行】
    TextField.wordWrap = true; //自动换行
    【用程序手段滚动文字】
    水平方向以像素为单位,而垂直方向以行做单位:
    scrollV: 指出文字框可见区域的最顶行,可读写;
    bottomScrollV: 指出文字框内最底端可见行,只读;
    maxScrollV: scrollV的最大值,只读;
    numLines: 定义多行文本字段中的文本行数,只读;
    TextField.scrollV = field.maxScrollV; //滚动到最后一页
    【响应滚动事件】
    field.addEventListener(Event.SCROLL, onTextScroll);
    【样式化文字的方法】
    1. 使用HTML标签进行样式化;
    2. 使用TextFormat对象;
    3. 使用CSS.
    例如: HTML是用<font>标签,TextFormat对象是设定font属性,而CSS是使用font-family属性的.
    受支持的层叠样式表(CSS)属性和值,及其相应的ActionScript属性名称(小括号内):
    color(color),display(display),font-family(fontFamily),font-size(fontSize),font-style(fontStyle),font-weight(fontWeight),kerning(kerning),leading(leading),letter-spacing(letterSpacing),margin-left(marginLeft),margin-right(marginRight),text-align(textAlign),text-decoration(textDecoration),text-indent(textIndent)
    受支持的HTML实体: <(小于号: <), >(大于号: >), &(和: &), "(双引号: "), '(撇号,单引号: &apos;)
    其中样式对象的两种写法:
    写法一:
    var sampleStyle:Object = new Object();
    sampleStyle.color = "#FFFFFF";
    sampleStyle.textAlign = "center";
    css.setStyle(".sample", sampleStyle);
    写法二:
    var sampleStyle:Object = {color: "#FFFFFF", textAlign: "center"};
    css.setStyle(".sample", sampleStyle);
    【对用户输入的文字进行样式化】
    使用defaultTextFormat属性,样式会施加至用户键入输入框的文字身上:
    var formatter:TextFormat = new TextFormat();
    formatter.color = 0x0000FF; //把文字变成蓝色
    field.defaultTextFormat = formatter;
    【对现有文字的一部分进行样式化】
    TextFormat.setTextFormat(format:TextFormat, beginIndex:int = -1, endIndex:int = -1):void
    【设定文字框的字体】
    例子:
    HTML: field.htmlText = "<font face='Arial'>Formatted text</font>";
    TextFormat: formatter.font = "Arial";
    CSS: P{ font-family: Arial; }
    也可以使用以逗号隔开的字体清单: formatter.font = "Arial, Verdana, Helvetica";
    注意:
    字体和字体群组不同.字体群组有三种: _sans,_serif以及_typewriter.
    _sans群组一般就是指Arial或Helvetica这种字体;
    _serif群组一般就是指Times或Times New Roman这种字体;
    _typewriter群组一般就是指Courier或Courier New这种字体.
    【嵌入字体】
    使用[Embed]后设标签.[Embed]后设标签应该出现在ActionScript文件中,处于类宣告之外.你可以内嵌TrueType字体或系统字体.内嵌TrueType字体时的语法:
    [Embed(source="pathToTtfFile", fontName="FontName", mimeType="application/x-font-truetype")]
    pathToTtfFile: ttf文件的路径,TrueType字体的路径可以是相对的,也可以是绝对的;
    FontName: 字体名称;
    内嵌系统字体的语法:
    [Embed(systemFont="Times New Roman", fontName="Times New Roman", mimeType="application/x-font-truetype")]
    fontName: 以相同名称作为实际系统字体名称.
    注意: 在使用嵌入字体时,要把TextField的embedFonts属性设为true,这样TextField只能用内嵌字体了.如果你试着替 embedFonts设为true的TextField使用设备字体,什么都不会显示.如果embedFonts设为true,就无法指定以逗号相隔的字 体清单.
    【建立可以旋转的文字】
    使用内嵌字体.当你旋转文字框时,设备字体就会消失.
    【显示Unicode文字】
    1. 从外部来源载入Unicode文字;
    2. 假如你的编辑器支持Unicode(如 Flex Builder),则可以直接在ActionScript程序中使用该字符;
    3. 使用Unicode转义字符,ActionScript里所有Unicode转义字符都以\u开头,后面再跟四位十六进制数字.
    注意: 如果你想取得Unicode字符,在Windows下使用: 开始>所有程序>附件>系统工具>字符映射表.
    【把Flash Player的焦点带给文字框】
    stage.focus = field;
    把焦点移除:
    stage.focus = null;
    注意: 当.swf文件首次载入至网页浏览器时,并没有焦点.因此,以程序的方式把焦点指定给Flash应用程序的一个元素前,必须先把焦点移至Flash Player.
    【以ActionScript选取文字】
    使用TextField.setSelection(beginIndex:int, endIndex:int):void
    为了可以正常选取文字,文字框必须具有焦点:
    stage.focus = field; //把焦点设给文字框
    field.text = "This is example text"; //设定文字
    field.setSelection(0, 4); //把"This"这个单词以高亮显示
    使用只读的selectionBeginIndex和selectionEndIndex属性访问所选取的字符范围的索引.
    【在文字内设定安插点(游标位置)并访问游标位置的索引值】
    可以使用TextField.setSelection()把起始和结尾的索引参数都设成相同值,在文字内设定游标位置(假设具有焦点):
    field.setSelection(0, 0); //在第一个字符前摆放安插点
    trace(field.caretIndex); //输出游标位置的索引值

    August 28

    actionscript3.0 图片裁剪及保存jpg详解

    Password的个人空间

    1. 客户端生成BitmapData 对象。
    2. 用JPGEncoder 对其编码相应的字节数组
    3 用URLRequest和URLLoader发送数据。
    4.服务用request.getInputStream()接收流..
    5.保存为图片格式。
    package
    ...{
        import flash.geom.Point;
        import flash.geom.Rectangle;
        import flash.net.URLLoader;
        import flash.net.URLRequest;
        import flash.events.* ;
        import flash.display.*;
        import flash.geom.* ;
        import flash.net.*;
        import flash.utils.ByteArray;
        import com.wdxc.util.* ;  
        public class Main extends Sprite
        ...{
            private var _picx:int = 0 ;
            private var _picy:int = 120 ; 
            private var _picwidth = 0 ;
            private var _picheight = 0 ;
            private var _bitmapdata:BitmapData ;
            private var _rect:Sprite ;//裁剪区域    
            private var _url:String ="http://192.168.0.211/test.jsp";
            public function Main():void...{    
                this.loadPic("F:\a.jpg"); 
                this.init();
            }     
            public function init():void ...{
                cut_btn.addEventListener(MouseEvent.MOUSE_DOWN, grabPic);
                save_btn.addEventListener(MouseEvent.MOUSE_DOWN, savePic) ;
            }
            /** *//****
             * 装载图片
             * @param    picurl 
             */  
            public function loadPic(picurl:String):void...{
                if (picurl == null || picurl == "")
                ...{
                    return ;   
                }
                var request:URLRequest = new URLRequest(picurl);
                var loader:Loader = new Loader() ;
                loader.load(request);
                loader.contentLoaderInfo.addEventListener(Event.COMPLETE, completeHander);
            }
            /** *//** 
             * 对图片编码并提交给服务端保存。
             * @param bitmapdata 图片数据 
             */      
            public function submit(bitmapdata:BitmapData):void ...{
                //每次URL不同,AS3才会提交每一次,否则将不提交。
                var url :String = _url+"?"+Math.floor(Math.random()*1000) ; 
                var request:URLRequest = new URLRequest(url); 
                //编码成图片格式流
                var encoder:JPGEncoder = new JPGEncoder(80);
                var bytes:ByteArray = encoder.encode(bitmapdata);     
                request.method = URLRequestMethod.POST;
                request.data = bytes ;  
                //设置成文件流形式
                request.contentType = "application/octet-stream";
                var loader:URLLoader = new URLLoader();                 
                loader.load(request) ;       
                loader.addEventListener(Event.COMPLETE, sendCompleteHandler) ; 
            }
            /** *//**
             * 服务端保存完回调
             * @param    e
             */
            private function sendCompleteHandler(e:Event):void ...{
    trace("save success........");    
            } 
            /** *//**
             * 保存裁剪图片
             * @param    e
             */
            private function savePic(e:MouseEvent)...{
                //组装要裁剪区域   
                var cutpic:Rectangle = new Rectangle(_rect.x,_rect.y,_rect.width,_rect.height);
                var bitmapdata:BitmapData = this.getCutData(_bitmapdata, cutpic); 
                var bitmap:Bitmap = new Bitmap(bitmapdata) ;          
                bitmap.x = 100 ;
                bitmap.y = 0 ; 
                //只显示裁剪区域图片,去除其他空位置 
                this.addChild(bitmap);   
                this.submit(cutbitmapdata);      
            }  
            /** *//**  
             * 获取所裁剪区域的数据。所有像素信息
             * @param source        源图数据  
             * @param rect          所有裁剪的区域    
             * @return BitmapData   裁剪出新图的数据
             */
            public function getCutData(source:BitmapData,rect:Rectangle):BitmapData ...{
                //存放裁剪出的新图片
                var cutbitmapdata:BitmapData = new BitmapData(Math.floor(_rect.width),Math.ceil(_rect.height)) ;
                //坐标转化,把坐标移到裁剪区域的位置,宽度和高度在cutbitmapdata里指定。
                var matrix:Matrix = new Matrix(1, 0, 0, 1, -Math.floor(_rect.x), -Math.floor(_rect.y));
                cutbitmapdata.draw(_bitmapdata, matrix); 
                return cutbitmapdata ; 
            }
            /** *//**** 
             * 装载图片完成之后,显示图片到场景
             * @param    e
             */
            private function completeHander(e:Event):void ...{
                var loader:Loader = e.target.loader as Loader;
                this._picwidth = loader.width ;
                this._picheight = loader.height ;     
                _bitmapdata= new BitmapData(loader.width, loader.height);
                _bitmapdata.draw(loader);
                var _bitmap:Bitmap = new Bitmap(_bitmapdata);       
                _bitmap.x = this._picx;
                _bitmap.y = this._picy ;
                this.addChild(_bitmap);
            }
            /** *//****     
             * 生成裁剪区域框,用来抓起图片
             * @param    e    
             */   
            private function grabPic(e:MouseEvent):void
            ...{
                _rect= new Sprite () ;
                /** *//***设置裁剪区域边框样式*/
                _rect.graphics.lineStyle(3, 0xFF0000, 0.5, true, LineScaleMode.NONE, CapsStyle.ROUND);
                _rect.graphics.beginFill(0xCCFF00,0);  
                _rect.graphics.drawRect(this._picx, this._picy, this._picwidth/4,this._picheight/4);
                _rect.graphics.endFill(); 
                _rect.addEventListener(MouseEvent.MOUSE_DOWN, mouseDownHandler) ;
                _rect.addEventListener(MouseEvent.MOUSE_UP, mouseUpHandle) ;
                this.addChild(_rect) ;        
            }
            /** *//**
             * 鼠标控制裁剪区域,可拖动,拉伸。
             * @param    e
             */
            private function mouseDownHandler(e:MouseEvent):void ...{
                //裁剪区域移动范围,不能超过原图区域。
                var _rectangle:Rectangle = new Rectangle();
                _rectangle.width = _picwidth-_rect.width ;
                _rectangle.height = _picheight-_rect.height ;      
                _rect.startDrag(false,_rectangle);            
            }
            private function mouseUpHandle(e:MouseEvent):void ...{
                _rect.stopDrag();
            }
        }
    }
    服务端处理代码
    <%
        String filePath = request.getRealPath(System.currentTimeMillis()+".jpg");
        System.out.print("filepath=="+filePath);
        BufferedInputStream inputStream = new BufferedInputStream(request.getInputStream());
        FileOutputStream utputStream = new FileOutputStream(new File(filePath));
        byte [] bytes = new byte[1024];
        int v;
        while((v=inputStream.read(bytes))>0){
            outputStream.write(bytes,0,v);
        }
        outputStream.close();
        inputStream.close();
    %>

    August 11

    ASCII转汉字

    String.fromCharCode()转的是Unicode码,如果要转ansi码,结果会是乱码,应该用以下方法转:
    var str:Array=[0xB9FE,0xB9FE,0xA3A1,0x21];
    var len:uint=str.length;
    var ba:ByteArray=new ByteArray();
    for (var i:uint=0; i<len; i++) {
         if(str[i]>0xFF)
             ba.writeShort(str[i]);
         else
             ba.writeByte(str[i]);
    }
    ba.position=0;
    var result:String=ba.readMultiByte(ba.length, "gb2312");
    trace(result);//结果为:     哈哈!!

    转:百度HI,老王杂货铺

    July 22

    发布SWF不成功!

    发布SWF不成功:

    flash cs3 发布不了SWF,
    除开发时用的电脑外,其他电脑都发布不了!
    状况是这样的,ctrl+ enter,有编译的条,但不输出SWF!
    头一次遇到不知道什么状况!
    如果不是别人要我的源码,还不知道会发生这样的情况!

    解决,将静态文本框修改成:动态

    将文本框设置成〔使用设备字体〕或〔可读性消除锯齿〕

    July 17

    firefox 3 对[中文]的支持不好

    用as3 做一个壳加载a[我].SWF,

    在IE和flash里显示正常!

    但在firefox3下显示不出a[我].SWF。

    去掉[我],显示正常。

    June 20

    控制客户端FLASH窗口数!

    演示:可以控制客户端的使用,限制用户只可以打开一个窗口

     

     

     

    May 26

    blog博客插入flash

    <P ALIGN="center"> <EMBED SRC="这里输入你的FLASH的URL地址" WIDTH="454" HEIGHT="384" TYPE="application/x-shockwave-flash"> </EMBED> </P>

    将上面的代码复制到你博客的HTML编辑器内就OK了!

    May 23

    as中心旋转

    as中心旋转:转cenFun Blog

    import flash.geom.Matrix;
    import flash.geom.Transform;
    function rotation(mc:MovieClip, d:Number) {
    var x:Number = mc._x;
    var y:Number = mc._y;
    var w:Number = mc._width;
    var h:Number = mc._height;
    var myMatrix:Matrix = new Matrix();
    var radians:Number = (d/180)*Math.PI;
    myMatrix.rotate(radians);
    var translateMatrix:Matrix = new Matrix();
    translateMatrix.translate(x+w/2-w/2*Math.cos(radians)+h/2*Math.sin(radians), y+h/2-w/2*Math.sin(radians)-h/2*Math.cos(radians));
    myMatrix.concat(translateMatrix);
    var rectangleTrans:Transform = new Transform(mc);
    rectangleTrans.matrix = myMatrix;
    }

    //调用,将obj旋转-90度:rotation(obj, -90);

    May 12

    AS3 找不到类的情况解决!

    解决方法:

    发布设置:

    actionScript 3.0设置:+以下代码

    $(AppConfig)/Component Source/ActionScript 3.0/User Interface

    April 28

    划分划分分类!

    Flash 3D去掉了,应用不多,直接加入FLASH的分类当中去了!