有 舞台根容器A,容器B,对象C:
C为B的子对象,B为A的子对象:
现,点击C实现拖动跟随效果:
C.addEventListener(egret.TouchEvent.TOUCH_BEGIN, this.onCiecleClick, this);
private target: egret.DisplayObject;
private juliPos: egret.Point;
private onCiecleClick(e: egret.TouchEvent): void {
this.target = e.currentTarget;
this.target.addEventListener(egret.TouchEvent.TOUCH_MOVE, this.tapMovingHandler, this);
this.target.addEventListener(egret.TouchEvent.TOUCH_END, this.tapCancleHandler, this);
let globalPos: egret.Point = new egret.Point();
this.target.localToGlobal(0, 0, globalPos);
this.juliPos = new egret.Point(globalPos.x - e.stageX, globalPos.y - e.stageY);
}
private tapMovingHandler(e: egret.TouchEvent): void {
let loacalPos: egret.Point = new egret.Point();
this.target.parent.globalToLocal(e.stageX + this.juliPos.x, e.stageY + this.juliPos.y,loacalPos);
this.target.x = loacalPos.x;
this.target.y = loacalPos.y;
}
private tapCancleHandler(e: TouchEvent): void {
this.lastTap.removeEventListener(egret.TouchEvent.TOUCH_MOVE, this.tapMovingHandler, this);
this.lastTap.removeEventListener(egret.TouchEvent.TOUCH_END, this.tapCancleHandler, this);
}
注意:
this.target为C,先将C的局部坐标转为全局坐标,在获取C的全局坐标和鼠标点击点的差值,拖动的时候,C的全局坐标及是鼠标点击处坐标和差值的和。
关键代码:
this.target.localToGlobal(0, 0, globalPos);
this.target.parent.globalToLocal(e.stageX + this.juliPos.x, e.stageY + this.juliPos.y,loacalPos);
localToGlobal:
如果C的中心点是左上角的话就要这样写:this.target.localToGlobal(0, 0, globalPos);
如果C的中心就是中心点的话就要这样写:this.target.localToGlobal(this.target.width/2, this.target.height/2, globalPos);
globalToLocal:
this.target.parent.globalToLocal(e.stageX + this.juliPos.x, e.stageY + this.juliPos.y,loacalPos);
C的坐标是相对于其父容器来讲的,故从全局坐标转局部坐标要转到C的父容器上