2011-01-05 43 views
0

中以逆时针方向旋转图片的问题,我使用eventRotateHit函数向一个方向旋转图片:顺时针旋转图片(+ 90°)。有用!在.swf对象中的Action Script 3

我需要创建一个逆时针(-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() { 

     } 

    } 

} 

感谢所有!

+1

似乎是从代码段太长,不正确格式化没有错,你的功能,除了(你可能想使用{}按钮)。恐怕我们无法帮助你,除非你澄清“不起作用”的含义,并将代码发布到imgHelper类的“旋转”函数中。 – weltraumpirat 2011-01-05 09:46:08

+0

@ user563685:只是一个不相关的提示:而不是'_img.rotate(( - 1)* Math.PI/2);''你可以做'_img.rotate(Math.PI/-2);' – 2011-01-05 09:57:30

+0

@weltraumpirat谢谢你的评论:我添加旋转功能和澄清 – 2011-01-05 10:19:08

回答

3

你的问题是在旋转矩阵:

位图围绕其原点(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

是的!!!!! !! 谢谢你这么多!我明白我的错误,现在,它工作得很好!对不起,我不能投票,因为我没有任何声望点。但是谢谢你! – 2011-01-05 12:36:31

+0

你可以接受这个答案,但是...;) – weltraumpirat 2011-01-05 12:51:06

+0

当然!完成! – 2011-01-05 13:55:37

-1

我认为你需要短暂的轮换,这是一个寻找新方向的最短路线的公式。旋转问题是,如果您旋转(使用正常旋转属性)从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; 
     } 
    } 
+0

Thank你的答案...但是,我做了一个短暂的旋转:Math.pi/-2是相同的,-90,没有?我认为我的问题是在旋转功能,现在我不能完全重做:( – 2011-01-05 10:53:38

+0

-90是最终值,它可以是任何你想要旋转的数字,我认为它是在旋转函数中,所以你需要实现像我在例子中使用的那个旋转公式,希望有帮助。 – 2011-01-05 11:23:19

+0

他正在旋转位图像素,而不是旋转DisplayObject – weltraumpirat 2011-01-05 11:40:38

相关问题