// 鼠标在屏幕上抬起 public void onScreenMouseUp() { mMouseDown = false; mDraging = false; mReleaseDragCallback?.Invoke(); }
public void setPosition(Vector3 pos) { mWindow.setPosition(pos); mPositionChangeCallback?.Invoke(); }
public override void update(float elapsedTime) { base.update(elapsedTime); if (mDraging) { Vector3 curPosition = mWindow.getPosition(); Vector3 prePos = curPosition; // 拖拽状态时,鼠标移动量就是窗口的移动量,此处未考虑父窗口的缩放不为1的情况 Vector3 moveDelta = getMousePosition() - mStartDragMousePosition; if (mDragDirection == DRAG_DIRECTION.HORIZONTAL) { moveDelta.y = 0.0f; } else if (mDragDirection == DRAG_DIRECTION.VERTICAL) { moveDelta.x = 0.0f; } curPosition = mStartDragWindowPosition + moveDelta; if (mClampInRange) { clampPosition(ref curPosition); } if (!isVectorEqual(ref prePos, ref curPosition)) { setPosition(curPosition); mDragingCallback?.Invoke(); } } else { // 自动停靠最近的边 if (mAutoMoveToEdge) { Vector3[] minMaxPos = getLocalMinMaxPixelPos(); Vector2 minPos = minMaxPos[0]; Vector2 maxPos = minMaxPos[1]; Vector3 curPosition = mWindow.getPosition(); Vector3 targetPosition = curPosition; // 获得当前最近的边 if (mDragDirection == DRAG_DIRECTION.HORIZONTAL) { targetPosition.x = getNearest(curPosition.x, minPos.x, maxPos.x); } else if (mDragDirection == DRAG_DIRECTION.VERTICAL) { targetPosition.y = getNearest(curPosition.y, minPos.y, maxPos.y); } else { mDisArray[0] = abs(curPosition.x - minPos.x); mDisArray[1] = abs(curPosition.x - maxPos.x); mDisArray[2] = abs(curPosition.y - minPos.y); mDisArray[3] = abs(curPosition.y - maxPos.y); int minIndex = -1; float minDistance = 0.0f; for (int i = 0; i < 4; ++i) { if (minIndex < 0 || minDistance > mDisArray[i]) { minIndex = i; minDistance = mDisArray[i]; } } if (minIndex == 0) { targetPosition.x = minPos.x; } else if (minIndex == 1) { targetPosition.x = maxPos.x; } else if (minIndex == 2) { targetPosition.y = minPos.y; } else if (minIndex == 3) { targetPosition.y = maxPos.y; } } if (!isVectorEqual(ref curPosition, ref targetPosition)) { Vector3 pos = lerp(curPosition, targetPosition, elapsedTime * mMoveToEdgeSpeed); setPosition(pos); } } else { Vector3 curPosition = mWindow.getPosition(); // 如果滑动已经超过了正常区域,则手指放开时回弹到正常范围内 Vector3 validPos = curPosition; if (!isValidPosition(ref curPosition, ref validPos, mAlignTopOrLeft)) { Vector3 newPos = lerp(curPosition, validPos, elapsedTime * mAutoClampSpeed); if (!isVectorEqual(ref newPos, ref curPosition)) { setPosition(newPos); } else { mMoveSpeed = 0.0f; } } else { // 按照当前滑动速度移动 if (mMoveSpeed > 0.0f) { // 只有鼠标未按下并且不自动停靠到最近的边时才衰减速度 Vector3 prePos = curPosition; mMoveSpeed = lerp(mMoveSpeed, 0.0f, elapsedTime * mAttenuateFactor, 10.0f); curPosition += mMoveNormal * mMoveSpeed * mMoveSpeedScale * elapsedTime; clampPosition(ref curPosition); if (!isVectorEqual(ref prePos, ref curPosition)) { setPosition(curPosition); } else { mMoveSpeed = 0.0f; } } } } } }