NLDClient-yudde/ProjectNLD/Assets/Code/Scripts/Framework/UI/ButtonEx.cs

282 lines
6.9 KiB
C#

using System;
using System.Collections.Generic;
//using CriWare;
using Sirenix.Utilities;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.InputSystem.UI;
using UnityEngine.UIElements;
public class ButtonEx: MonoBehaviour, IPointerUpHandler, IPointerDownHandler, IDragHandler, IBeginDragHandler, IEndDragHandler
{
private bool _isPressed;
private bool _isLastFramePressed;
private float _pressedTime;
private float MinDelta = 0.1f;
private float MinLongPressTime = 0.75f;
private float MinUpDelta = 1f;
private List<PointerEventData> _pointerEventDatas = new();
private PointerEventData _curPointerEventData;
#region 继承滑动、按下抬起
public delegate void BeginDrag(PointerEventData eventData);
public delegate void OnDragging(PointerEventData eventData);
public delegate void EndDrag(PointerEventData eventData);
public delegate void OnPointUp(PointerEventData eventData);
public delegate void OnPointDown(PointerEventData eventData);
public BeginDrag beginDrag;
public OnDragging onDragging;
public EndDrag endDrag;
public OnPointUp onPointUp;
public OnPointDown onPointDown;
public void OnPointerUp(PointerEventData eventData)
{
// if (eventData.pointerId >= 0)
// {
// DebugUtil.LogError("OnPointerUp eventData.pointerId = " + eventData.pointerId);
// return;
// }
if (_bUpDrag && _pressedTime < MinLongPressTime)
{
if (_bOnClick)
{
onClick?.Invoke();
_bOnClick = false;
}
}
_curPointerEventData = null;
_isPressed = false;
_bLongPress = false;
_bUpDrag = false;
onPointUp?.Invoke(eventData);
}
public void OnPointerDown(PointerEventData eventData)
{
// if (eventData.pointerId >= 0)
// {
// DebugUtil.LogError("OnPointerUp eventData.pointerId = " + eventData.pointerId);
// return;
// }
_curPointerEventData = eventData;
_isPressed = true;
_bLongPress = true;
_bUpDrag = true;
_bOnClick = true;
_startPos = eventData.pressPosition;
onPointDown?.Invoke(eventData);
}
public void OnDrag(PointerEventData eventData)
{
if (eventData.pointerId < 0)
{
_curPointerEventData = eventData;
}
onDragging?.Invoke(eventData);
}
public void OnBeginDrag(PointerEventData eventData)
{
if (eventData.pointerId < 0)
{
_curPointerEventData = eventData;
}
beginDrag?.Invoke(eventData);
}
public void OnEndDrag(PointerEventData eventData)
{
if (eventData.pointerId < 0)
{
_curPointerEventData = eventData;
}
endDrag?.Invoke(eventData);
}
public void AddPointerUp(Action<PointerEventData> action)
{
onPointUp += (eventData) =>
{
action?.Invoke(eventData);
};
}
public void AddPointerDown(Action<PointerEventData> action)
{
onPointDown += (eventData) =>
{
action?.Invoke(eventData);
};
}
public void AddBeginDrag(Action<PointerEventData> action)
{
beginDrag += (eventData) =>
{
action?.Invoke(eventData);
};
}
public void AddOnDrag(Action<PointerEventData> action)
{
onDragging += (eventData) =>
{
action?.Invoke(eventData);
};
}
public void AddEndDrag(Action<PointerEventData> action)
{
endDrag += (eventData) =>
{
action?.Invoke(eventData);
};
}
#endregion
#region 扩展上滑、长按
private bool _bUpDrag;
private bool _bLongPress;
private bool _bOnClick;
public delegate void OnUpDrag();
public delegate void OnLongPress();
public delegate void OnClick();
public OnUpDrag onUpDrag;
public OnLongPress onLongPress;
public OnClick onClick;
private Vector2 _startPos;
private Vector2 _curPos;
public void AddLongPress(Action action)
{
onLongPress += () =>
{
action?.Invoke();
};
}
public void AddUpDrag(Action action)
{
onUpDrag += () =>
{
action?.Invoke();
};
}
public void AddUpDrag<T>(Action<T> action, T param)
{
onUpDrag += () =>
{
action?.Invoke(param);
};
}
public void AddLongPress<T>(Action<T> action, T param)
{
onLongPress += () =>
{
action?.Invoke(param);
};
}
public void AddClick(Action action)
{
onClick += () =>
{
action?.Invoke();
};
}
#endregion
private void Update()
{
if (!_isPressed)
{
//_bOnClick = false;
_isLastFramePressed = false;
_pressedTime = 0f;
return;
}
if (_isPressed)
{
_curPos = _curPointerEventData.position;
//长按
if (_bLongPress)
{
var disSqr = (_curPos - _startPos).sqrMagnitude;
if (disSqr > MinDelta)
{
_bLongPress = false;
_bOnClick = false;
}
else
{
if (_pressedTime > MinLongPressTime)
{
onLongPress?.Invoke();
_bLongPress = false;
}
}
}
//上滑
if (_bUpDrag)
{
//_bOnClick = false;
var disSqrY = Mathf.Sqrt(_curPos.y - _startPos.y);
var disSqrX = Mathf.Sqrt(_curPos.x - _startPos.x);
if (disSqrY > MinUpDelta && disSqrX < disSqrY / 2)
{
onUpDrag?.Invoke();
_bUpDrag = false;
}
}
_pressedTime += Time.deltaTime;
if (!_isLastFramePressed)
{
_isLastFramePressed = true;
}
}
}
public void RemoveAllPointerUp()
{
onPointUp = null;
}
public void RemoveAll()
{
beginDrag = null;
onDragging = null;
endDrag = null;
onPointUp = null;
onPointDown = null;
onClick = null;
}
/// <summary>
/// 设置按下时判断参数
/// </summary>
/// <param name="minDelta"></param>
/// <param name="minTime"></param>
/// <param name="minUpDelta"></param>
public void InitParam(float minDelta = 0.1f, float minTime = 0.5f, float minUpDelta = 0.5f)
{
MinDelta = minDelta;
MinLongPressTime = minTime;
MinUpDelta = minUpDelta;
}
}