#if UNITY_2019_4_OR_NEWER using System; using UnityEditor; using UnityEngine; using UnityEditor.UIElements; using UnityEngine.UIElements; namespace YooAsset.Editor { public class ResizeHandle : VisualElement { public new class UxmlFactory : UxmlFactory { } private bool _isResizing = false; private float _initialWidth; private Vector2 _initialMousePos; /// /// 控制的UI元素 /// public VisualElement ControlTarget { get; set; } /// /// 控制元素的最小宽度 /// public int ControlMinWidth { get; set; } /// /// 控制元素的最大宽度 /// public int ControlMaxWidth { get; set; } /// /// 尺寸发生变化 /// public Action ResizeChanged { get; set; } public ResizeHandle() { int defaultWidth = 5; this.style.width = defaultWidth; this.style.minWidth = defaultWidth; this.style.maxWidth = defaultWidth; this.style.opacity = 0; this.style.cursor = UIElementsCursor.CreateCursor(MouseCursor.ResizeHorizontal); this.RegisterCallback(OnMouseDown); this.RegisterCallback(OnMouseMove); this.RegisterCallback(OnMouseUp); } public ResizeHandle(int handleWidth, VisualElement controlTarget, int controlMinWidth, int controlMaxWidth) { ControlTarget = controlTarget; ControlMinWidth = controlMinWidth; ControlMaxWidth = controlMaxWidth; this.style.width = handleWidth; this.style.minWidth = handleWidth; this.style.maxWidth = handleWidth; this.style.opacity = 0; this.style.cursor = UIElementsCursor.CreateCursor(MouseCursor.ResizeHorizontal); this.RegisterCallback(OnMouseDown); this.RegisterCallback(OnMouseMove); this.RegisterCallback(OnMouseUp); } private void OnMouseDown(MouseDownEvent evt) { // 鼠标左键按下 if (ControlTarget != null && evt.button == 0) { _isResizing = true; _initialWidth = ControlTarget.resolvedStyle.width; _initialMousePos = evt.mousePosition; this.CaptureMouse(); } } private void OnMouseMove(MouseMoveEvent evt) { if (ControlTarget != null && _isResizing) { // 计算鼠标移动距离 float deltaX = evt.mousePosition.x - _initialMousePos.x; // 更新控制元素尺寸 float newWidth = _initialWidth + deltaX; float width = Mathf.Clamp(newWidth, ControlMinWidth, ControlMaxWidth); ControlTarget.style.width = width; ControlTarget.style.minWidth = width; ControlTarget.style.maxWidth = width; ResizeChanged?.Invoke(width); } } private void OnMouseUp(MouseUpEvent evt) { // 鼠标左键释放 if (ControlTarget != null && evt.button == 0) { _isResizing = false; this.ReleaseMouse(); } } } } #endif