本地座标和全局座标转化

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

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