本地坐标和全局坐标转化

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

发布了61 篇原创文章 · 获赞 2 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/qq_22794043/article/details/89855827