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;
///
/// 连按
///
public Action longPress;
///
/// 长按结束
///
public Action longPressEnd;
///
/// 是否按下状态
///
[HideInInspector] public bool isPressd;
private bool _isTriggerLongPress;
///
/// 是否触发了长按
///
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();
}
}
}
///
/// 终止
///
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;
}
}