| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128 | using System;using System.Collections;using System.Collections.Generic;using Fort23.UTool;using UnityEngine;using UnityEngine.EventSystems;public class LongPressBtn : MonoBehaviour, IPointerDownHandler, IPointerUpHandler, IPointerExitHandler,    IPointerClickHandler{    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;    void OnPress(bool pressed)    {        if (pressed) // 按下        {            isPressd = true;        }        else // 松开或离开        {            if (isPressd)            {                if (_isTriggerLongPress) // 触发了长按且不是离开,执行 longPressEnd                {                    longPressEnd?.Invoke();                    _isTriggerLongPress = false;                }            }            isPressd = false;            _time = 0;        }    }    private void Update()    {        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;        }    }    public void OnPointerDown(PointerEventData eventData)    {        OnPress(true);    }    public void OnPointerUp(PointerEventData eventData)    {        OnPress(false);    }    public void OnPointerExit(PointerEventData eventData)    {        OnPress(false);    }    public void OnPointerClick(PointerEventData eventData)    {        if (!_isTriggerLongPress) // 只有未触发长按时才触发点击        {            onClick?.Invoke();        }        isPressd = false;    }}
 |