using UnityEngine;
using UnityEngine.Events;
using UnityEngine.EventSystems;
///
/// 接受拖动操作的Ui底层组件,Unity原生接口需要额外处理一些释放的问题
///
public class UiDragComponent : MonoBehaviour, IDragHandler, IPointerDownHandler, IPointerUpHandler
{
///
/// 当前操作的手指Id
///
public int? CurrentPointerId { get; private set; }
///
/// 上次移动的缓存位置
///
public Vector2 lastPoint { get; private set; }
///
/// 手指从一点移动到下一点
///
public event UnityAction onDrag;
///
/// 手指按下操作
///
public event UnityAction onPress;
///
/// 手指抬起操作
///
public event UnityAction onUp;
private void OnDisable()
{
Release();
}
private void OnApplicationFocus(bool hasFocus)
{
if (!hasFocus)
Release();
}
public void OnPointerDown(PointerEventData eventData)
{
if (CurrentPointerId == null)
{
CurrentPointerId = eventData.pointerId;
lastPoint = eventData.position;
if (onPress != null)
onPress(lastPoint);
}
}
public void OnDrag(PointerEventData eventData)
{
if (CurrentPointerId == eventData.pointerId)
{
if (onDrag != null)
onDrag(lastPoint, eventData.position);
lastPoint = eventData.position;
}
}
public void OnPointerUp(PointerEventData eventData)
{
if (CurrentPointerId == eventData.pointerId)
{
lastPoint = eventData.position;
Release();
}
}
public void Release()
{
var temp = CurrentPointerId;
CurrentPointerId = null;
if (temp != null)
{
if (onUp != null)
onUp(lastPoint);
}
}
}