Проблема поворота изображения в направлении против часовой стрелки в Action Script 3 - PullRequest
0 голосов
/ 05 января 2011

в объекте .swf, я поворачиваю изображения в одном направлении: по часовой стрелке (+ 90 °) с помощью функции eventRotateHit.Это работает!

Мне нужно создать функцию против часовой стрелки (-90 °): eventRotateHit2.Эта функция не работает: изображение исчезает.Я думаю, это потому, что центр вращения ложный, но я не уверен.И я не знаю, как это изменить.

Можете ли вы мне помочь, пожалуйста?

Фредерик

Мой код:

package Classes.image

{
        import fl.controls.Button;
        import flash.display.Bitmap;
        import flash.display.MovieClip;
        import Classes.utils.*;
        import Classes.*;
        import flash.events.*;
        import flash.text.TextField;
        import flash.text.StyleSheet;
        import flash.utils.ByteArray;
        import flash.display.BitmapData;
        import com.adobe.images.JPGEncoder;

        public class imgBox extends MovieClip
        {
                public var _img                                 : imgHelper;
                private var _MAX_WIDTH                          : Number;
                private var _MAX_HEIGHT                         : Number;
                private var boxFrame:MovieClip;
                private var statusMsg:TextField;

                public var byteData:ByteArray;

                public function imgBox(w:Number,h:Number,_bitmap:Bitmap) 
                {
                        _MAX_WIDTH = w;
                        _MAX_HEIGHT = h;

                        var borderColor:uint  = 0x666666;
                        var borderSize:uint   = 1;
                        var vMenu:verticalMenu;

                        _img = new imgHelper(_bitmap);
                        _img.addEventListener("invalidate", eventImageInvalidated);
                        if ( _bitmap.width > _MAX_WIDTH || _bitmap.height > _MAX_HEIGHT ) 
                                 _img.resizePic(_MAX_WIDTH, _MAX_HEIGHT, false);

                        boxFrame = new MovieClip;
                        boxFrame.graphics.lineStyle(borderSize, borderColor);
                        boxFrame.graphics.drawRect(0, 0, _img.width+4,_img.height+4);
                        addChild(boxFrame);

                        addChild(_img);
                        boxFrame.x = 60 + _img.theImage.x;
                        boxFrame.y = _img.theImage.y;
                        _img.x = 62;
                        _img.y = 2;

                        //vMenu = new verticalMenu();
                        //var myMenu:Array = new Array( { label:'Rotate', _function:eventRotateHit } );// ,
                                                                        //      { label:'Upload', _function:eventUploadHit } );
                        //vMenu.buildMenu(myMenu);

                        var  button:Button = new Button();
                        button.label = Local.getInstance().getString("rotate");
                        button.width = 50;
                        button.addEventListener(MouseEvent.CLICK, eventRotateHit);
                        addChild(button);

                        var  buttonbis:Button = new Button();
                        buttonbis.label = Local.getInstance().getString("rotate");
                        buttonbis.width = 50;
                        buttonbis.y = 50;
                        buttonbis.addEventListener(MouseEvent.CLICK, eventRotateHit2);
                        addChild(buttonbis);

                }


                private function eventImageInvalidated(e:Event) {
                        e.stopImmediatePropagation();

                        dispatchEvent(new Event("invalidate", true, true));// invalidate for re-encoding the image.

                }

                private function eventUploadHit(e:*) {
                        trace('Upload Hit');
                        this.dispatchEvent(new Event("uploadImage"));
                }

                public function showStatus(msg:String) {
                                TweenLite.to(boxFrame, 0.5, { height: _img.height + 24 } );
                                var vMenu:verticalMenu = new verticalMenu();;
                                if (statusMsg){
                                        removeChild(statusMsg);
                                        statusMsg = null;
                                }
                                statusMsg = new TextField();
                                statusMsg.htmlText = msg;
                                statusMsg.styleSheet = vMenu._textStyleSheet;
                                statusMsg.width = _img.width;
                                addChild(statusMsg);
                                statusMsg.y = _img.height + 2;
                                statusMsg.x = boxFrame.x + 10;

                }

                public function hideStatus(msg:String = "") {
                                if (statusMsg){
                                        removeChild(statusMsg);
                                        statusMsg = null;
                                }
                                TweenLite.to(boxFrame, 0.5, { height: _img.height + 4 } );
                }

                private function eventRotateHit(e:*) {
                        trace('rotate Image');
                        if (statusMsg){
                                        removeChild(statusMsg);
                                        statusMsg = null;
                                }

                        _img.rotate(Math.PI / 2);
                        _img.resizePic(_MAX_WIDTH, _MAX_HEIGHT, false);
                        boxFrame.width = _img.width + 4;
                        boxFrame.height = _img.height + 4;

                        boxFrame.x = 60 + _img.theImage.x;
                        boxFrame.y = _img.theImage.y;

                }

                private function eventRotateHit2(e:*) {
                        trace('rotate Image');
                        if (statusMsg){
                                        removeChild(statusMsg);
                                        statusMsg = null;
                                }

                        _img.rotate((-1)*Math.PI/2);
                        _img.resizePic(_MAX_WIDTH, _MAX_HEIGHT, false);
                        boxFrame.width = _img.width + 4;
                        boxFrame.height = _img.height + 4;

                        boxFrame.x = 60 + _img.theImage.x;
                        boxFrame.y = _img.theImage.y;           

                }

                public function dispose() {

                }

                public function prepare(w:Number, h:Number, q:Number) {
                        var btData:BitmapData = _img.resizeBitmapData(w, h);
                        byteData = new JPGEncoder(q).encode(btData);

                }

        }

}

здесьфункция поворота:

package Classes.utils
{
    import flash.display.Bitmap;
    import flash.display.DisplayObject;
    import flash.display.MovieClip;
    import flash.net.*;
    import flash.display.Loader;
    import flash.events.*;
    import flash.system.LoaderContext;
    import flash.text.TextField;
    import flash.geom.ColorTransform;
    import flash.geom.Matrix;
    import flash.display.BitmapData;
    import Classes.*;
    import flash.utils.ByteArray;

    public class imgHelper extends MovieClip
    {
        public var tt:TextField;
        public var theImage:Bitmap;
        private var myMask:MovieClip;


        private var _boxDimW:Number;
        private var _boxDimH:Number;




        public function imgHelper(img:Bitmap=null) 
        {
            theImage = img;
            if (theImage)
                addChild(theImage);
             tt = new TextField;
            tt.text = '0%';
        /*  addChild(tt);*/

        }

        public override function get width():Number {
            return theImage.width;
        }

        public override function get height():Number {
            return theImage.height;
        }
        public  function get _scaleX():Number {
            return theImage.scaleX;
        }
        public  function set _scaleX(sx) {
             theImage.scaleX = sx;
        }

        public  function get _scaleY():Number {
            return theImage.scaleY;
        }
        public  function set _scaleY(sy:Number) {
             theImage.scaleY = sy;
        }

        public function load(url:String)
        {
            //trace('loading : ' + url);
            var loader:Loader = new Loader();
            loader.contentLoaderInfo.addEventListener(Event.COMPLETE, picLoaded);
            loader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, errLoading);
            loader.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, progress);
            var lContext:LoaderContext = new LoaderContext(true);



            var request:URLRequest = new URLRequest(url);
            try {
                loader.load(request,lContext);


            } catch (error:Error) {
                trace("Unable to load requested document.");
            }

        }
        private function progress(e:ProgressEvent)
        {
            tt.text = Math.round(e.bytesLoaded /e.bytesTotal *100) + '%';
        }

        private function errLoading(e:*)
        {
            tt.visible = false;
            dispatchEvent(new Event("imgLoaded",true,true));
        }

        private function picLoaded(e:*)
        {
            var picLoader:Loader = Loader(e.target.loader);
            theImage = Bitmap(picLoader.content);
            addChild(theImage);

            tt.visible = false;
            dispatchEvent(new Event("imgLoaded",true,true));
        }

        public function resizePic(rW:Number,rH:Number,crop:Boolean=false)
        {
            var img = theImage;
            _boxDimW = rW;
            _boxDimH = rH;

            if (img.width > img.height)
            {
                img.width = rW;
                img.height = img.height * img.scaleX;
            }
            else
            {
                img.height = rH;
                img.width = img.width * img.scaleY;
            }


            if (crop)
            {
                if (img.width < img.height)
                {
                    var oldScaleX = img.scaleX;
                    img.width = rW;
                    img.scaleY += img.scaleX-oldScaleX;

                }
                else
                {
                    var oldScaleY = img.scaleY;
                    img.height = rH;
                    img.scaleX += img.scaleY-oldScaleY;

                }

                maskIt(rW, rH);

            }
            else {
                if (img.height < img.width) {
                    img.y=(rH-img.height)/2
                }
                else {
                    img.x=(rW-img.width)/2

                }
            }



        }



        public function resizeBitmapData (rW:Number, rH:Number):BitmapData {
            var img:Bitmap = new Bitmap(theImage.bitmapData);
            trace('resize bitmap : ' + img.height + '-' + img.width);
            trace('resize bitmap : ' + rH + '-' + rW);
            if (img.width > img.height) {
                    if (img.height>rH)
                        rH = img.height * (rW / img.width);
                    else{ // do not resize
                        rH = img.height;
                        rW = img.width;
                    }
            }
            else {
                if (img.width>rW)
                    rW = img.width * (rH / img.height);
                else{ // do not resize
                        rH = img.height;
                        rW = img.width;
                    }

            }

            var bmpData:BitmapData = new BitmapData(rW, rH);
            var scaleMatrix:Matrix = new Matrix( rW / img.width , 0, 0, rH / img.height   , 0,0);
            var colorTransform:ColorTransform = new ColorTransform();
            bmpData.draw(theImage, scaleMatrix , colorTransform, null, null, true);
            return (bmpData);
        }

        public function rotate(dir:Number) {


            var workingImage:Bitmap = new Bitmap(theImage.bitmapData.clone());
            var bmpData:BitmapData = new BitmapData(workingImage.height, workingImage.width);
            var transMatrix:Matrix = new Matrix(Math.cos(dir),Math.sin(dir),-Math.sin(dir),Math.cos(dir), workingImage.height,0);
            var colorTransform:ColorTransform = new ColorTransform();
            bmpData.draw(workingImage, transMatrix, colorTransform, null, null, true);
            TweenLite.to(theImage, 0.5, { autoAlpha:0 } );
            //removeChild(theImage);
            theImage = new Bitmap(bmpData);
            addChild(theImage);
            //trace(theImage.y + '--' + theImage.x+'--'+theImage.height+'--'+theImage.width);
            if (theImage.height < theImage.width) {
                    theImage.y += (_boxDimH - theImage.height) / 2
                }
                else {
                    theImage.x +=(_boxDimW-theImage.width)/2

                }


            theImage.alpha = 0;
            TweenLite.to(theImage, 1, { autoAlpha:1 } );
            trace('sending event !');
            dispatchEvent(new Event("invalidate", true, true));// invalidate for re-encoding the image.
        }


        public function maskIt(w:Number, h:Number)
        {
            if (myMask) {
                removeChild(myMask);
                myMask = null;
            }
            myMask = new MovieClip();
            myMask.graphics.beginFill(0xFFCC00);
            myMask.graphics.drawRect(0, 0, w,h);
            addChild(myMask);
            this.mask = myMask;
        }

        public function dispose() {

        }

    }

}

спасибо всем !!!

Ответы [ 2 ]

3 голосов
/ 05 января 2011

Ваша проблема в матрице вращения:

Ваше растровое изображение вращается вокруг своего начала (0,0), поэтому на 90 градусов оно находится за пределами видимой области слева.По этой причине вы перевели его вдоль оси x на высоту исходного изображения - и это работает.

Теперь, когда вы поворачиваете изображение на 270 градусов (или -90 градусов, то же самое), оно находится над видимой областью.Теперь вам нужно перевести его вдоль оси y на ширину исходного изображения:

var dir:Number = Math.PI*1.5; // the same as 3*Math.PI/2
var a:Number = Math.cos(dir);
var b:Number = Math.sin(dir);
var c:Number = -b;
var d:Number = a;
var transMatrix:Matrix = new Matrix(a,b,c,d,0,workingImage.width);
0 голосов
/ 05 января 2011

Я думаю, что вам нужно короткое вращение, это формула, чтобы найти кратчайший путь в новом направлении.Проблема с вращением состоит в том, что если вы вращаете (используя свойство обычного вращения) от 0 до -90 со скоростью 1, потребуется (360-90 =) 270 шагов.При коротком повороте вам понадобится всего 90 шагов (так как большинство кругов - 360 градусов).

Надеюсь, этот фрагмент кода поможет вам изучить короткий поворот:

    var startValue:int = targetMC.rotation = 0;
    var endValue:int = -90;
    var position:Number = 0; // should always be ratio betweeen 0-1

    addEventListener(Event.ENTER_FRAME, update);

    function update(e:Event=null):void
    {
        if (position < 1)
        {
         position += 0.05;
         targetMC.rotation = startValue + (((endValue - startValue + 540) % 360) - 180) * position;
        }
    }
...