| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239 | using System;using System.Collections;using System.Collections.Generic;using Fort23.UTool;using UnityEngine;using UnityEngine.EventSystems;public class LongPressDragBtn : MonoBehaviour, IPointerDownHandler, IPointerUpHandler, IPointerExitHandler,    IPointerClickHandler, IDragHandler, IBeginDragHandler, IEndDragHandler, IPointerEnterHandler{    private float _time;    public float startTime = 0.5f;    public float intervalTime = 0.05f;    public Action onClick;    /// <summary>    /// 连按    /// </summary>    public Action longPress;    /// <summary>    /// 长按结束    /// </summary>    public Action longPressEnd;    /// <summary>    /// 是否按下状态    /// </summary>    [HideInInspector] public bool isPressd;    private bool _isTriggerLongPress;    /// <summary>    /// 是否触发了长按    /// </summary>    public bool IsTriggerLongPress => _isTriggerLongPress;    // 拖拽相关变量    private bool _isDragging;    private Vector2 _dragStartPosition;    /// <summary>    /// 拖拽阈值(像素),超过这个距离才认为是拖拽    /// </summary>    public float dragThreshold = 10f;    /// <summary>    /// 拖拽开始事件    /// </summary>    public Action<PointerEventData> onDragStart;    /// <summary>    /// 拖拽进行中事件    /// </summary>    public Action<PointerEventData> onDrag;    /// <summary>    /// 拖拽结束事件    /// </summary>    public Action<PointerEventData> onDragEnd;    public Action<PointerEventData> onPointerEnter;    public Action<PointerEventData> onPointerExit;    void OnPress(bool pressed)    {        if (pressed) // 按下        {            isPressd = true;            _isDragging = false; // 重置拖拽状态        }        else // 松开或离开        {            if (isPressd)            {                if (_isTriggerLongPress && !_isDragging) // 触发了长按且不是拖拽,执行 longPressEnd                {                    longPressEnd?.Invoke();                    _isTriggerLongPress = false;                }            }            isPressd = false;            _time = 0;        }    }    private void Update()    {        // 如果正在拖拽,不执行长按逻辑        if (_isDragging) return;        if (isPressd && !_isTriggerLongPress)        {            _time += Time.deltaTime;            if (_time >= startTime)            {                _isTriggerLongPress = true;                _time -= intervalTime;                longPress?.Invoke();            }        }        else if (isPressd && _isTriggerLongPress)        {            _time += Time.deltaTime;            if (_time >= intervalTime)            {                _time -= intervalTime;                longPress?.Invoke();            }        }    }    /// <summary>    /// 终止    /// </summary>    public void Terminated()    {        if (isPressd)        {            isPressd = false;            if (_isTriggerLongPress)            {                longPressEnd?.Invoke();            }            _isTriggerLongPress = false;            _time = 0;        }        _isDragging = false; // 同时终止拖拽状态    }    public void OnPointerDown(PointerEventData eventData)    {        _dragStartPosition = eventData.position;        OnPress(true);    }    public void OnPointerUp(PointerEventData eventData)    {        // 如果正在拖拽,先触发拖拽结束        if (_isDragging)        {            OnEndDrag(eventData);        }        OnPress(false);    }    public void OnPointerExit(PointerEventData eventData)    {        onPointerExit?.Invoke(eventData);        // 如果正在拖拽,不处理退出事件(拖拽过程中允许离开按钮区域)        if (!_isDragging)        {            OnPress(false);        }    }    public void OnPointerEnter(PointerEventData eventData)    {        onPointerEnter?.Invoke(eventData);    }    public void OnPointerClick(PointerEventData eventData)    {        // 如果发生了拖拽,不触发点击事件        if (_isDragging || _isTriggerLongPress) return;        onClick?.Invoke();        isPressd = false;    }    // ========== 拖拽相关方法 ==========    public void OnBeginDrag(PointerEventData eventData)    {        // 检查是否达到拖拽阈值        if (Vector2.Distance(eventData.position, _dragStartPosition) >= dragThreshold && !_isDragging)        {            _isDragging = true;            // 开始拖拽时终止长按逻辑            if (_isTriggerLongPress)            {                longPressEnd?.Invoke();                _isTriggerLongPress = false;            }            onDragStart?.Invoke(eventData);        }    }    public void OnDrag(PointerEventData eventData)    {        if (_isDragging)        {            onDrag?.Invoke(eventData);        }        else        {            // 如果还没有正式开始拖拽,检查是否达到阈值            if (Vector2.Distance(eventData.position, _dragStartPosition) >= dragThreshold)            {                OnBeginDrag(eventData);            }        }    }    public void OnEndDrag(PointerEventData eventData)    {        if (_isDragging)        {            onDragEnd?.Invoke(eventData);            _isDragging = false;        }    }    /// <summary>    /// 检查是否正在拖拽    /// </summary>    public bool IsDragging => _isDragging;    /// <summary>    /// 强制结束拖拽    /// </summary>    public void ForceEndDrag()    {        if (_isDragging)        {            _isDragging = false;            onDragEnd?.Invoke(null);        }    }}
 |