AS3技术问询:如何在1520宽度区域内动态居中MovieClip
问题分析与解决方案
你的核心问题是用错了居中计算的公式——之前写的floorplanMCAG.x = 1520 - floorplanMCAG.width是把元件的右边缘对齐到1520的位置,完全不是居中逻辑,这才导致不同宽度的元件出现偏移。
要让动态宽度的MovieClip在固定1520宽的区域内居中,正确的逻辑是:
- 算出区域可用宽度与元件宽度的差值,这个差值就是元件左右两边的留白总和
- 把差值除以2,得到单边的留白宽度
- 再加上区域的左边界X坐标,就是元件最终的X位置
结合你的代码场景,我帮你调整了关键部分:
首先,先明确你的目标区域参数(从你代码里的map_boundsFLRPLSAG来看,我假设区域左边界是520,宽度1520,如果实际不是,你只需要修改targetAreaStartX和targetAreaWidth的值即可):
function loadFloorplanAG(e:Event):void { floorplanMCAG.addChild(loader); floorplanMCAG.height = 468; floorplanMCAG.y = 570; floorplanMCAG.scaleX = floorplanMCAG.scaleY; // 核心:替换错误的X赋值,使用正确的居中公式 var targetAreaStartX:Number = 520; // 目标区域的左边缘X坐标 var targetAreaWidth:Number = 1520; // 目标区域的固定宽度 floorplanMCAG.x = targetAreaStartX + (targetAreaWidth - floorplanMCAG.width) / 2; trace(floorplanMCAG.width); // 修正边界矩形的宽度为目标区域的1520(之前你写错成元件宽度了) map_boundsFLRPLSAG = new Rectangle(targetAreaStartX, 570, targetAreaWidth, floorplanMCAG.height); min_zoomFLRPLSAG = floorplanMCAG.scaleX; // 保留你的触摸事件监听 stage.addEventListener(TouchEvent.TOUCH_BEGIN, touchBeginFLRPLSAG) stage.addEventListener(TouchEvent.TOUCH_MOVE, touchMovedFLRPLSAG) stage.addEventListener(TouchEvent.TOUCH_END, touchEndFLRPLSAG) modelInformationAG.addChild(floorplanMCAG); modelInformationAG.setChildIndex(floorplanMCAG, 0); }
验证效果
- 当元件宽度为1023.9时,计算得
x = 520 + (1520 - 1023.9)/2 = 768.05,元件中心正好落在区域的中心位置(520 + 1520/2 = 1280) - 当元件宽度为396.8时,计算得
x = 520 + (1520 - 396.8)/2 = 1081.6,元件中心同样落在区域中心,完美居中
另外,注意我修正了map_boundsFLRPLSAG的宽度参数——之前你把它设为元件的宽度,这显然不符合“区域宽度1520”的需求,现在改成固定的1520,这样后续的缩放拖拽逻辑也会基于正确的边界区域运行。
内容的提问来源于stack exchange,提问作者user979331
相关产品推荐
相关产品推荐

