2013-01-12 38 views
0

即時通訊試圖讓我的手機安卓項目縮放。問題是,我想用兩個手指的特定位置指向和捏他們變焦(不單單隻圖像,整個活動視圖):捏一個特定的點並放大整個視圖?

private function onGestureZoom(event:TransformGestureEvent):void{ 
    if(canvas.scaleY.valueOf() >= 1) { 
     canvas.scaleX *= event.scaleX; 
     canvas.scaleY *= event.scaleY; 
    } else { 
     canvas.scaleX = 1; 
     canvas.scaleY = 1; 
    } 
} 
+0

曾經對此發表任何進展,我目前面臨類似的問題?到目前爲止,我一直在使用我的顯示對象的transform.matrix來調整tx和ty值,然後縮放然後重置tx ty值。這幾乎可以工作,但是確定在物體縮放時需要補償多少是困難的。 – shaunhusain

+0

其實只是想出了這個不知道,如果你仍然在附近或它是相關的,但我會無論如何張貼答案。授予我最初的方法是不同的,所以你必須適應你自己的解決方案,我使用了原始的TouchEvents。 – shaunhusain

回答

0

這樣的回答包括:(利息)我兩班已經寫了,幫助抽象的問題重新使用的一些功能。我也在這裏包含了ToolBase,但對於理解這個問題並不重要。基本上MultiTouchTool.as被設置爲捕獲TouchEvents並在一個對象中跟蹤它們,它還基於我需要了解的用於我的用例的一些常見操作調用一些方法(我只是擴展這個類並覆蓋了我想要的方法掛鉤)。

然後,關鍵元素位於NavigatorTool.as中,該元素使用對象原始轉換矩陣並調整翻譯,然後縮放然後重新調整翻譯。這有效地移動了註冊點。因此,圖像向上並向左移動,因此兩個手指之間的點現在位於左上角,然後縮放圖像並重置位置。由於縮放是以增量方式進行的,我不斷更新intialDistance(名稱可能會引起誤解)。

在我的情況我縮放一個名爲layerM這是一個雪碧,但任何DisplayObject將工作。

[MultiTouchTool.as]

package com.shaunhusain.fingerPainting.tools 
{ 
    import flash.display.Stage; 
    import flash.events.TouchEvent; 
    import flash.geom.Point; 

    public class MultiTouchTool extends ToolBase implements ITool 
    { 
     protected var pointsTracked:Number = 0; 
     protected var ptsTracked:Object; 
     public function MultiTouchTool(stage:Stage) 
     { 
      super(stage); 
      ptsTracked = {}; 
     } 

     public function takeAction(event:TouchEvent=null):void 
     { 
      switch(event.type) 
      { 
       case TouchEvent.TOUCH_BEGIN: 
        ptsTracked[event.touchPointID] = new Point(event.stageX, event.stageY); 
        pointsTracked++; 
        if(pointsTracked>1) 
         secondFingerDown(); 
        break; 

       case TouchEvent.TOUCH_MOVE: 
        switch(pointsTracked) 
        { 
         case 1: 
          oneFingerMoving(event); 
          break; 
         case 2: 
          twoFingersMoving(event); 
          break; 

        } 
        ptsTracked[event.touchPointID] = new Point(event.stageX, event.stageY); 
        break; 

       case TouchEvent.TOUCH_END: 
       case TouchEvent.TOUCH_ROLL_OUT: 
        switch(pointsTracked) 
        { 
         case 1: 
          oneFingerEnd(); 
          break; 
         case 2: 
          twoFingerEnd(); 
          break; 
        } 


        ptsTracked[event.touchPointID] = null; 
        pointsTracked--; 
        if(pointsTracked<0) 
         pointsTracked = 0; 
        break; 
      } 
     } 

     protected function oneFingerEnd():void 
     { 
      trace("default handler for one finger end, not overridden"); 
     } 
     protected function twoFingerEnd():void 
     { 
      trace("default handler for two finger end, not overridden"); 
     } 
     protected function oneFingerMoving(event:TouchEvent):void 
     { 
      trace("default handler for one finger moving, not overridden"); 
     } 
     protected function twoFingersMoving(event:TouchEvent):void 
     { 
      trace("default handler for two fingers moving, not overridden"); 
     } 
     protected function secondFingerDown():void 
     { 
      trace("default handler for second finger down, not overridden"); 
     } 

     public function toString():String 
     { 
      return "Multi-Touch tool"; 
     } 
    } 
} 

[NavigatorTool.as]

package com.shaunhusain.fingerPainting.tools 
{ 
    import flash.display.Stage; 
    import flash.events.TouchEvent; 
    import flash.geom.Matrix; 
    import flash.geom.Point; 

    /** 
    * Allows the layer manager to be panned and zoomed on, other tools are 
    * responsible for taking into account the current zoom and pan position 
    * when modifying the layers. 
    */ 
    public class NavigationTool extends MultiTouchTool implements ITool 
    { 
     private var initialDistance:Number; 
     private var newDistance:Number; 
     private var layerLocal:Point; 
     //-------------------------------------------------------------------------------- 
     //    Constructor 
     //-------------------------------------------------------------------------------- 
     public function NavigationTool(stage:Stage) 
     { 
      super(stage); 
     } 


     override public function toString():String 
     { 
      return "Navigation"; 
     } 

     //-------------------------------------------------------------------------------- 
     //    Overrides 
     //-------------------------------------------------------------------------------- 
     override protected function oneFingerMoving(event:TouchEvent):void 
     { 
      var currentTouchPrevPos:Point = ptsTracked[event.touchPointID]; 
      var offset:Point = new Point(event.stageX-currentTouchPrevPos.x,event.stageY-currentTouchPrevPos.y); 
      layerM.x += offset.x; 
      layerM.y += offset.y; 
     } 
     override protected function twoFingersMoving(event:TouchEvent):void 
     { 
      if(isNaN(initialDistance)) 
      { 
       initialDistance = Point.distance(ptsTracked[0],ptsTracked[1]); 
       layerLocal = new Point((ptsTracked[0].x+ptsTracked[1].x)/2,(ptsTracked[0].y+ptsTracked[1].y)/2); 
      } 
      else 
      { 
       newDistance = Point.distance(ptsTracked[0],ptsTracked[1]); 

       var matrix:Matrix = layerM.transform.concatenatedMatrix.clone(); 

       matrix.tx -= layerLocal.x; 
       matrix.ty -= layerLocal.y; 
       matrix.scale(newDistance/initialDistance,newDistance/initialDistance); 
       matrix.tx += layerLocal.x; 
       matrix.ty += layerLocal.y; 

       layerM.transform.matrix = matrix; 

       initialDistance = newDistance; 
      } 
     } 
     override protected function twoFingerEnd():void 
     { 
      initialDistance = NaN; 
     } 

    } 
} 

[ToolBase.as]

package com.shaunhusain.fingerPainting.tools 
{ 
    import com.shaunhusain.fingerPainting.view.managers.LayerManager; 
    import com.shaunhusain.fingerPainting.view.managers.SecondaryPanelManager; 
    import com.shaunhusain.fingerPainting.managers.UndoManager; 
    import com.shaunhusain.fingerPainting.model.PaintModel; 

    import flash.display.Stage; 

    /** 
    * Base class for tools to give them all easy access to the Singletons and 
    * the Stage. 
    */ 
    public class ToolBase 
    { 
     //-------------------------------------------------------------------------------- 
     //    Variables 
     //-------------------------------------------------------------------------------- 
     protected var model:PaintModel = PaintModel.getInstance(); 
     protected var undoManager:UndoManager = UndoManager.getIntance(); 
     protected var secondaryPanelManager:SecondaryPanelManager = SecondaryPanelManager.getIntance(); 
     protected var layerM:LayerManager = LayerManager.getIntance(); 
     protected var stage:Stage; 

     //-------------------------------------------------------------------------------- 
     //    Constructor 
     //-------------------------------------------------------------------------------- 
     public function ToolBase(stage:Stage) 
     { 
      this.stage = stage; 
     } 
    } 
}