本地座標和全局座標轉化

涉及到的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);

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章