涉及到的API
globalToLocal
localToGlobal
toParentPoint
fromParentPoint
/**
* 把本地座標轉換爲相對stage的全局座標。
* @param point 本地座標點。
* @param createNewPoint (可選)是否創建一個新的Point對象作爲返回值,默認爲false,使用輸入的point對象返回,減少對象創建開銷。
* @return 轉換後的座標的點。
*/
public function localToGlobal(point:Point, createNewPoint:Boolean = false):Point {
//if (!_displayedInStage || !point) return point;
if (createNewPoint === true) {
point = new Point(point.x, point.y);
}
//此處的this指的是調用此API的對象
var ele:Sprite = this;
while (ele) {
if (ele == Laya.stage) break;
point = ele.toParentPoint(point);
ele = ele.parent as Sprite;
}
return point;
}
/**
* 把stage的全局座標轉換爲本地座標。
* @param point 全局座標點。
* @param createNewPoint (可選)是否創建一個新的Point對象作爲返回值,默認爲false,使用輸入的point對象返回,減少對象創建開銷。
* @return 轉換後的座標的點。
*/
public function globalToLocal(point:Point, createNewPoint:Boolean = false):Point {
//if (!_displayedInStage || !point) return point;
if (createNewPoint) {
point = new Point(point.x, point.y);
}
//此處的this指的是調用此API的對象
var ele:Sprite = this;
var list:Array = [];
while (ele) {
if (ele == Laya.stage) break;
list.push(ele);
ele = ele.parent as Sprite;
}
var i:int = list.length - 1;
while (i >= 0) {
ele = list[i];
point = ele.fromParentPoint(point);
i--;
}
return point;
}
/**
* 將本地座標系座標轉轉換到父容器座標系。
* @param point 本地座標點。
* @return 轉換後的點。
*/
public function toParentPoint(point:Point):Point {
if (!point) return point;
point.x -= pivotX;
point.y -= pivotY;
if (transform) {
_transform.transformPoint(point);
}
point.x += _x;
point.y += _y;
var scroll:Rectangle = this._style.scrollRect;
if (scroll) {
point.x -= scroll.x;
point.y -= scroll.y;
}
return point;
}
/**
* 將父容器座標系座標轉換到本地座標系。
* @param point 父容器座標點。
* @return 轉換後的點。
*/
public function fromParentPoint(point:Point):Point {
if (!point) return point;
point.x -= _x;
point.y -= _y;
var scroll:Rectangle = this._style.scrollRect;
if (scroll) {
point.x += scroll.x;
point.y += scroll.y;
}
if (transform) {
//_transform.setTranslate(0,0);
_transform.invertTransformPoint(point);
}
point.x += pivotX;
point.y += pivotY;
return point;
}
當需要的某個元素的父容器和要添加的子元素的容器不是同一個元素,需要用到此處的座標轉化
查API可以發現,
//設置p的座標(此時p參考的原點座標爲ele的(0,0)點)
var p:Point = new Point(x,y);
//將p相對於ele的本地座標轉化爲相對Stage的全局座標,轉化之後,p參考的原點座標爲Stage的(0,0點)
ele.localToGlobal(p);
//將p相對於Stage的全局座標轉化爲相對anotherEle的本地座標,轉化之後,p參考的原點座標爲anotherEle的(0,0)點
anotherEle.globalToLocal(p);
//設置p的座標(此時p參考的原點座標爲ele的(0,0)點)
var p:Point = new Point(x,y);
//將p相對於ele的本地座標轉化爲相對Stage的全局座標,轉化之後,p參考的原點座標爲Stage的(0,0點)
ele.localToGlobal(p);
//將p相對於Stage的全局座標轉化爲相對anotherEle的本地座標,轉化之後,p參考的原點座標爲anotherEle的(0,0)點
anotherEle.globalToLocal(p);