2013-01-12 34 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; 
     } 
    } 
}