2

startDrag()とstopDrag()を使用してオブジェクトをドラッグすると、オブジェクトのx、y座標に影響しないのはなぜですか?

この例を実行して、自分の目で確かめることができます(円を移動してトレースメッセージを確認してください)。

<fx:Script>
    <![CDATA[
        import mx.events.FlexEvent;

        private function mouseDown(event:MouseEvent):void {
            circle.startDrag(false, new Rectangle(0,0 , 400, 400));
        }


        private function mouseReleased(event:MouseEvent):void {
            circle.stopDrag();
            trace("ended drag X: " + circle.x + ", Y: " + circle.y);
        }


        protected function application1_creationCompleteHandler(event:FlexEvent):void
        {
            circle.addEventListener(MouseEvent.MOUSE_DOWN, mouseDown) 
            circle.addEventListener(MouseEvent.MOUSE_UP, mouseReleased);
        }

    ]]>
</fx:Script>

<fx:Declarations>
    <!-- Place non-visual elements (e.g., services, value objects) here -->
</fx:Declarations>

<s:Rect id="target1" x="0" y="10" width="150" height="150">
    <s:fill>
        <s:SolidColor color="0xFF0000"/>
    </s:fill>
</s:Rect>

<s:Rect id="target2" x="200" y="10" width="150" height="150">
    <s:fill>
        <s:SolidColor color="0x00FF00"/>
    </s:fill>
</s:Rect>

<s:Graphic id="circle" x="200" y="200">
    <s:Ellipse height="100" width="250">
        <s:stroke>
            <s:SolidColorStroke color="0x000000" weight="2"/>
        </s:stroke>
        <s:fill>
            <s:RadialGradient>
                <s:entries>
                    <s:GradientEntry color="0x0056FF" ratio="0.00" alpha="0.5"/>
                    <s:GradientEntry color="0x00CC99" ratio="0.33" alpha="0.5"/>
                    <s:GradientEntry color="0xECEC21" ratio="0.66" alpha="0.5"/>
                </s:entries>
            </s:RadialGradient>
        </s:fill>
    </s:Ellipse>
</s:Graphic>

4

3 に答える 3

1

このコードを試してください:

    import mx.core.mx_internal;
    use namespace mx_internal;

    private function mouseDown(event:MouseEvent):void {
        circle.startDrag(false, new Rectangle(0,0 , 400, 400));
    }


    private function mouseReleased(event:MouseEvent):void {
        circle.stopDrag();

        circle.x = circle.mx_internal::$x;
        circle.y = circle.mx_internal::$y;

        trace("ended drag X: " + circle.x + ", Y: " + circle.y);
    }


    protected function application1_creationCompleteHandler(event:FlexEvent):void
    {
        circle.addEventListener(MouseEvent.MOUSE_DOWN, mouseDown) 
        circle.addEventListener(MouseEvent.MOUSE_UP, mouseReleased);
    }

]]>

于 2010-06-03T11:56:02.200 に答える
1

大きな荒らしですが、 circle.getBounds() は、追加の作業を必要としないより優れたソリューションです。

于 2010-11-01T05:14:59.220 に答える
0

問題は、関数が呼び出されたときにのみデータが渡されることだと思います。もっと簡単に言えば、チェックしたい情報が更新されていないということです。したがって、次のことを試してみてください。

circle.addEventListener(MouseEvent.MOUSE_DOWN, mouseDown);
circle.addEventListener(MouseEvent.MOUSE_UP, mouseReleased);

private function mouseDown(event:MouseEvent):void {
    addEventListener(Event.ENTER_FRAME, dragMe);
}
function dragMe (e:Event) {
    circle.startDrag(false, new Rectangle(0,0 , 400, 400));
    trace("starting drag X: " + circle.x + ", Y: " + circle.y);
}
private function mouseReleased(event:MouseEvent):void {
    circle.stopDrag();
    trace("ended drag X: " + circle.x + ", Y: " + circle.y);
}

このようなもの。ENTER_FRAME イベントを使用すると、Flash が更新され、フレームごとにデータが渡されます。したがって、デフォルトでは、1 秒あたり 24 回になります。(ただし、これは Flash も 1 秒間に 24 回トレースすることを意味します)。mouseReleased 関数では、その位置を一度だけチェックする必要があるため、これを行う必要はないと思います。

于 2011-06-09T10:31:31.360 に答える