這樣的回答包括:(利息)我兩班已經寫了,幫助抽象的問題重新使用的一些功能。我也在這裏包含了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;
}
}
}
曾經對此發表任何進展,我目前面臨類似的問題?到目前爲止,我一直在使用我的顯示對象的transform.matrix來調整tx和ty值,然後縮放然後重置tx ty值。這幾乎可以工作,但是確定在物體縮放時需要補償多少是困難的。 – shaunhusain
其實只是想出了這個不知道,如果你仍然在附近或它是相關的,但我會無論如何張貼答案。授予我最初的方法是不同的,所以你必須適應你自己的解決方案,我使用了原始的TouchEvents。 – shaunhusain