在as3 / flex中移动图像时会抛出#2025错误

时间:2012-09-17 11:48:06

标签: actionscript-3 flex

当我尝试运行代码时,会抛出错误:

  

TypeError:错误#1034:类型强制失败:无法将mx.controls :: Image @ a9030b1转换为mx.containers.Canvas。

当我试图替换

var num1:int = Canvas(event.currentTarget).mouseX;

var num1:int = Image(event.currentTarget).mouseX;

它会抛出以下错误:

  

ArgumentError:错误#2025:提供的DisplayObject必须是调用者的子级。

以下是代码,

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" creationComplete="carcan();">
<mx:Script>
    <![CDATA[

            import mx.containers.Canvas;
            import mx.controls.Image;

            private var images:Array;
            private var dragInitiator:Image = new Image();
            private const IMAGE_COUNT:uint = 5;
            private var img:Image;


            private var dragInitiator:Image = new Image();

            private var points:flash.geom.Point;
            private var offset_x:int;
            private var offset_y:int;
            private var canal:Canvas;
            private var doDrag:Boolean;

            [Embed(source='cards/2C.png')]
            private var Image0:Class;

            [Embed(source='cards/2D.png')]
            private var Image1:Class;

            [Embed(source='cards/2H.png')]
            private var Image2:Class;

            [Embed(source='cards/2S.png')]
            private var Image3:Class;

            [Embed(source='cards/3C.png')]
             private var Image4:Class;

             public function carcan():void
             {
                canal = new Canvas();
                canal.setStyle("backgroundColor","blue");
                canal.x=100;
                canal.y=50;
                canal.width=500;
                canal.height=400;
                this.addChild(canal);
                init();
             }

             public function init():void
             {
              images = new Array(IMAGE_COUNT);

                 for (var i:int = 0; i < IMAGE_COUNT; i++)
                    {
                         img= new Image();
                            images[i] = this["Image" + i];
                            trace(images[i]);

                    img.x=(i*30)+50;
                    img.source=images[i];
                    img.id="Image"+i;
                    canal.addChild(img);

                     img.addEventListener(MouseEvent.MOUSE_DOWN, md);
                    img.addEventListener(MouseEvent.MOUSE_MOVE, mm);
                    img.addEventListener(MouseEvent.MOUSE_UP, mu); 

                    }

             }

                public function md(event:MouseEvent):void
            {
                img = new Image();
                doDrag=true;

                canal.setChildIndex(Image(event.target), images.length-1);
                img.addEventListener(MouseEvent.MOUSE_MOVE, mm);


            }
            public function mm(event:MouseEvent):void
            {


                 if(doDrag==true)
                 {
                    points = new Point();
                images = new Array(IMAGE_COUNT);


                img = new Image();
                img = Image(event.target);

                points.x=event.target.x;
                points.y=event.target.y;
                points = localToGlobal(points);
                img.x=points.x;
                img.y=points.y;


                var boundar:flash.geom.Rectangle=new Rectangle(this.x, this.y, this.width/ 2 + 3 * offset_x, this.height / 2 + 3 * offset_x);
                img.startDrag(false, boundar);
                 }
            }

            public function onmove(event:MouseEvent):void
            {

                img = new Image();

            }

            public function mu(event:MouseEvent):void
            {
                canal = new Canvas();
                canal.stopDrag();
                doDrag=false;



                this.stopDrag();
                doDrag=false;
                var num1:int = Canvas(event.currentTarget).mouseX;

        if(num1 > 50 && num1 < 80){
             canal.setChildIndex(dragInitiator, 0);
             setCards();                
            }
        if(num1 > 80 && num1 < 110){
             canal.setChildIndex(dragInitiator, 1);
            setCards(); 
            }
        if(num1 > 110 && num1 < 140){
             canal.setChildIndex(dragInitiator, 2);
            setCards(); 
            }
        if(num1 > 140 && num1 < 170){
             canal.setChildIndex(dragInitiator, 3);
            setCards(); 
            }
        if(num1 > 170 && num1 < 200){
            canal.setChildIndex(dragInitiator, 3);
            setCards(); 
            }


            }

             private function setCards():void{
            var b:int = 0;
            var a:int;
            var cardsArray:Array = this.getChildren();
            for(a = 0;a < cardsArray.length; a++)
            {
                canal.getChildAt(a).x = 90+b;
                b=b+20;
            }
             }

    ]]>
</mx:Script>    
</mx:Application>

2 个答案:

答案 0 :(得分:1)

您需要将其转换为图像,而不是将图像转换为CAnvas(第一个错误)。

import spark.components.Image;

public function mu(event:MouseEvent):void {
    var current:Image = event.currentTarget as Image; //this is the correct way to cast event.currentTarget
}

答案 1 :(得分:0)

这两个错误源于不同的陈述: #1034来自。{ var num1:int = Canvas(event.currentTarget).mouseX; 因为img不是画布

#2025来自其中一个。{ canal.setChildIndex(dragInitiator, ...); 因为img不是运河的孩子,所以你必须addChild(...)才能setChildIndex(...)

你可以使用addChildAt而不是setChildIndex它可以使用相同的效果,如果效率不高的话。