Posts Tagged ‘ActionScript’

  • 方法如下:

    override public function dispatchEvent(evt:Event):Boolean {
     	if (hasEventListener(evt.type) || evt.bubbles) {
      		return super.dispatchEvent(evt);
      	}
     	return true;
    }

    好处吗?当然是性能,hasEventListener可要比dispatchEvent速度快N倍,如果你的项目中有大量的Event要被长时间分发,性能的优势就看出来了 。

  • ApplicationDomain应该怎么用,文档都看了800多次了,就是记不住,没办法,天生的记忆力弱,这东西又不经常用。

    干脆总结一下写出来,以后如果再忘记,也不用去查文档了。

    new ApplicationDomain(ApplicationDomain.currentDomain) = Child可以直接使用Parent的Class,Parent则不可直接调用,必须是私用ApplicationDomain.getDefinition()来调用。

    ApplicationDomain.currentDomain  = Child和Parent可以任意使用对方的Class(Class重名会冲突)。

    new ApplicationDomain(null) = Child和Parent将使用自己的Class(Class重名不会冲突),如果一方要调用另一方的Class,要使用ApplicationDomain.getDefinition()。推荐用这种,麻烦就麻烦吧,起码可控性高。

     

  • 也就是很熟悉的混合模式,BlendMode类枚举了所有的混合模式,如下

    • BlendMode.ADD ("add"):通常用于创建两个图像之间的动画变亮模糊效果。
    • BlendMode.ALPHA ("alpha"):通常用于在背景上应用前景的透明度。
    • BlendMode.DARKEN ("darken"):通常用于重叠类型。
    • BlendMode.DIFFERENCE ("difference"):通常用于创建更多变动的颜色。
    • BlendMode.ERASE ("erase"):通常用于使用前景 Alpha 剪掉(擦除)背景的一部分。
    • BlendMode.HARDLIGHT ("hardlight"):通常用于创建阴影效果。
    • BlendMode.INVERT ("invert"):用于反转背景。
    • BlendMode.LAYER ("layer"):用于强制为特定显示对象的预构成创建临时缓冲区。
    • BlendMode.LIGHTEN ("lighten"):通常用于重叠类型。
    • BlendMode.MULTIPLY ("multiply"):通常用于创建阴影和深度效果。
    • BlendMode.NORMAL ("normal"):用于指定混合图像的像素值覆盖基本图像的像素值。
    • BlendMode.OVERLAY ("overlay"):通常用于创建阴影效果。
    • BlendMode.SCREEN ("screen"):通常用于创建亮点和镜头眩光。
    • BlendMode.SUBTRACT ("subtract"):通常用于创建两个图像之间的动画变暗模糊效果。
    其中,BlendMode.LAYER只是强制缓冲图像,不进行实际混合,有很多实际用途,例如,使TextField的Alpha起作用…
  • 原来describeType是这么用的…

    <?xml version="1.0" encoding="utf-8"?>
    <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute"
    creationComplete="init()">
    <mx:Script>
    <![CDATA[
    import mx.controls.Alert;
    public function init():void{
    
    var description : XML = describeType( this );
    var accessors : XMLList = description.accessor.( @access == "readwrite" ).@name;
    
    var str:String;
    for ( var i : uint = 0; i < accessors.length(); i++ )
    {
    var name : String = accessors[ i ];
    
    str += (name+”\n”);
    }
    Alert.show(str);
    }
    ]]>
    </mx:Script>
    </mx:Application>
  • 作用:返回name所指向的类的引用

    示例:

    package {
        import flash.display.DisplayObject;
        import flash.display.Sprite;
        import flash.utils.getDefinitionByName;
    
        public class GetDefinitionByNameExample extends Sprite {
            private var bgColor:uint = 0xFFCC00;
            private var size:uint = 80;
    
            public function GetDefinitionByNameExample() {
                var ClassReference:Class = getDefinitionByName("flash.display.Sprite") as Class;
                var instance:Object = new ClassReference();
                instance.graphics.beginFill(bgColor);
                instance.graphics.drawRect(0, 0, size, size);
                instance.graphics.endFill();
                addChild(DisplayObject(instance));
            }
        }
    }

    说白了,就是要实例化Sprite的时候不写new Sprite()的另外一种方法,再延伸一点,就是可以用字符串来决定创建什么类。或者可以用来读取共享库中的类。

  • 普通模式下切换为全屏模式,全屏模式下切换为普通模式。

    代码:

    _btn.addEventListener(MouseEvent.CLICK,fullScreen);
    function fullScreen(e:MouseEvent):void {
    stage.displayState = stage.displayState == StageDisplayState.NORMAL ? StageDisplayState.FULL_SCREEN : StageDisplayState.NORMAL;;
    }
    
  • 在要编译的工程上点右键 -> Properties -> Flex Compiler
    在Additonal compiler arguments中输入

    -keep-generated-actionscript=true
    

    编译此Flex工程后,Flex Builder将在src文件夹(源文件的文件夹)下面创建一个名为generated的文件夹,里面为此工程的纯AS文件。

  • AS代码(Flex):

    <?xml version="1.0" encoding="utf-8"?>
    <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute"
    creationComplete="init()">
    <mx:Script>
    <![CDATA[
    import mx.controls.Alert;
    
    private function init():void{
    ExternalInterface.addCallback("callBack",callBack);
    }
    
    private function asCallJS():void{
    Alert.show(ExternalInterface.call("call"));
    }
    
    private function callBack(s:String):void{
    Alert.show(s);
    }
    ]]>
    </mx:Script>
    <mx:Button label=”读取JS中的数据” click=”asCallJS()”/>
    </mx:Application>
    

    JS代码:

    <script language="javascript" type="text/javascript">
    function call(){
    return 'CZBIN.COM';
    }
    function callBack(){
    document.getElementById("ConnJs").callBack('www.czbin.com');
    }
    </script>
    
  • 前几天做了一个虚线画图形的类,实现了Flash自带的所有绘图方法,不过在图形很小时,会出现一些BUG,等过些时间修复了再传上来。

    就现在而言,最难实现的应该是圆角矩形,或者说是椭圆。

    这几天又研究了一下,想用一个稍微简单点的公式实现(用角度递增,以前是用贝塞尔曲线做的线段等比递增),先贴上来。角度递增在椭圆的时候会出现线段不等长。但当长短轴相同,也就是圆的时候,还是可以凑合用的…需要的朋友可以照下面的代码研究一下,算法很简单。

    <?xml version="1.0" encoding="utf-8"?>
    <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" creationComplete="init()">
    <mx:Script>
    <![CDATA[
    
    import mx.core.UIComponent;
    
    public function init():void
    {
    var UI:UIComponent = new UIComponent();
    var centerX:Number = 200, centerY:Number = 200;
    var radiusX:Number = 100, radiusY:Number = 150;
    var positionX:Number, positionY:Number;
    var angle:Number = 0;
    var change:Boolean = true;
    var solidAdjust:int = 80;
    var spaceAdjust:int = 100;
    addChild(UI);
    UI.graphics.lineStyle(1);
    UI.graphics.moveTo(centerX+radiusX, centerY);
    
    for (angle; angle <= 2.1*Math.PI;angle ){
    positionX = centerX + Math.cos(angle) * radiusX;
    positionY = centerY + Math.sin(angle) * radiusY;
    if(change){
    UI.graphics.lineTo(positionX, positionY);
    angle += Math.PI / solidAdjust;
    }else{
    UI.graphics.moveTo(positionX, positionY);
    angle += Math.PI / spaceAdjust;
    }
    change = !change;
    }
    }
    ]]>
    </mx:Script>
    </mx:Application>