namespace SRF.UI { using System; using UnityEngine; using UnityEngine.EventSystems; using UnityEngine.UI; public class DragHandle : MonoBehaviour, IBeginDragHandler, IEndDragHandler, IDragHandler { private CanvasScaler _canvasScaler; private float _delta; private float _startValue; public RectTransform.Axis Axis = RectTransform.Axis.Horizontal; public bool Invert = false; public float MaxSize = -1; public LayoutElement TargetLayoutElement; public RectTransform TargetRectTransform; private float Mult { get { return Invert ? -1 : 1; } } public void OnBeginDrag(PointerEventData eventData) { if (!Verify()) { return; } //Debug.Log("OnBeginDrag"); _startValue = GetCurrentValue(); _delta = 0; } public void OnDrag(PointerEventData eventData) { if (!Verify()) { return; } //Debug.Log("OnDrag"); var delta = 0f; if (Axis == RectTransform.Axis.Horizontal) { delta += eventData.delta.x; } else { delta += eventData.delta.y; } if (_canvasScaler != null) { delta /= _canvasScaler.scaleFactor; } delta *= Mult; _delta += delta; SetCurrentValue(Mathf.Clamp(_startValue + _delta, GetMinSize(), GetMaxSize())); } public void OnEndDrag(PointerEventData eventData) { if (!Verify()) { return; } //Debug.Log("OnEndDrag"); SetCurrentValue(Mathf.Max(_startValue + _delta, GetMinSize())); _delta = 0; CommitCurrentValue(); } private void Start() { Verify(); _canvasScaler = GetComponentInParent(); } private bool Verify() { if (TargetLayoutElement == null && TargetRectTransform == null) { Debug.LogWarning( "DragHandle: TargetLayoutElement and TargetRectTransform are both null. Disabling behaviour."); enabled = false; return false; } return true; } private float GetCurrentValue() { if (TargetLayoutElement != null) { return Axis == RectTransform.Axis.Horizontal ? TargetLayoutElement.preferredWidth : TargetLayoutElement.preferredHeight; } if (TargetRectTransform != null) { return Axis == RectTransform.Axis.Horizontal ? TargetRectTransform.sizeDelta.x : TargetRectTransform.sizeDelta.y; } throw new InvalidOperationException(); } private void SetCurrentValue(float value) { if (TargetLayoutElement != null) { if (Axis == RectTransform.Axis.Horizontal) { TargetLayoutElement.preferredWidth = value; } else { TargetLayoutElement.preferredHeight = value; } return; } if (TargetRectTransform != null) { var d = TargetRectTransform.sizeDelta; if (Axis == RectTransform.Axis.Horizontal) { d.x = value; } else { d.y = value; } TargetRectTransform.sizeDelta = d; return; } throw new InvalidOperationException(); } private void CommitCurrentValue() { if (TargetLayoutElement != null) { if (Axis == RectTransform.Axis.Horizontal) { TargetLayoutElement.preferredWidth = ((RectTransform) TargetLayoutElement.transform).sizeDelta.x; } else { TargetLayoutElement.preferredHeight = ((RectTransform) TargetLayoutElement.transform).sizeDelta.y; } } } private float GetMinSize() { if (TargetLayoutElement == null) { return 0; } return Axis == RectTransform.Axis.Horizontal ? TargetLayoutElement.minWidth : TargetLayoutElement.minHeight; } private float GetMaxSize() { if (MaxSize > 0) { return MaxSize; } return float.MaxValue; } } }