using UnityEngine; 
 | 
using UnityEngine.UI; 
 | 
using UnityEngine.EventSystems; 
 | 
  
 | 
public class UGUIEventListenerContainDrag : MonoBehaviour, 
 | 
                            IPointerClickHandler, 
 | 
                            IPointerDownHandler, 
 | 
                            IPointerEnterHandler, 
 | 
                            IPointerExitHandler, 
 | 
                            IPointerUpHandler, 
 | 
                            IBeginDragHandler, 
 | 
                            IDragHandler, 
 | 
                            IEndDragHandler 
 | 
{ 
 | 
    public delegate void VoidDelegate(GameObject go); 
 | 
    public delegate void VoidDelegateDrag(GameObject go, PointerEventData eventData); 
 | 
    public VoidDelegate OnClick { get; set; } 
 | 
    public VoidDelegate OnDown { get; set; } 
 | 
    public VoidDelegate OnEnter { get; set; } 
 | 
    public VoidDelegate OnLongPress { get; set; } 
 | 
    public VoidDelegate OnExit { get; set; } 
 | 
    public VoidDelegate OnUp { get; set; } 
 | 
    public VoidDelegateDrag OnDragStart { get; set; } 
 | 
    public VoidDelegateDrag OnDraging { get; set; } 
 | 
    public VoidDelegateDrag OnDragEnd { get; set; } 
 | 
  
 | 
    private string mAudioType; 
 | 
    //是否处于按下状态 与长按配合使用 
 | 
    bool isDown = false; 
 | 
    float time = 0; 
 | 
  
 | 
    public void OnPointerClick(PointerEventData eventData) 
 | 
    { 
 | 
        if (OnClick != null) 
 | 
        { 
 | 
            if (!GetComponent<Button>() || GetComponent<Button>().interactable) 
 | 
            { 
 | 
                OnClick(gameObject); 
 | 
            } 
 | 
        } 
 | 
    } 
 | 
    public void OnPointerDown(PointerEventData eventData) 
 | 
    { 
 | 
        OnDown?.Invoke(gameObject); 
 | 
        time = Time.realtimeSinceStartup; 
 | 
        isDown = true; 
 | 
    } 
 | 
    public void OnPointerEnter(PointerEventData eventData) { OnEnter?.Invoke(gameObject); } 
 | 
    public void OnPointerExit(PointerEventData eventData) { OnExit?.Invoke(gameObject); isDown = false; } 
 | 
    public void OnPointerUp(PointerEventData eventData) { OnUp?.Invoke(gameObject); isDown = false; time = Time.realtimeSinceStartup; } 
 | 
    public void OnBeginDrag(PointerEventData eventData) { OnDragStart?.Invoke(gameObject, eventData); } 
 | 
    public void OnDrag(PointerEventData eventData) { OnDraging?.Invoke(gameObject, eventData); } 
 | 
    public void OnEndDrag(PointerEventData eventData) { OnDragEnd?.Invoke(gameObject, eventData); } 
 | 
  
 | 
    public static UGUIEventListenerContainDrag Get(GameObject go, string clickAudio = null) 
 | 
    { 
 | 
        UGUIEventListenerContainDrag listener = go.GetComponent<UGUIEventListenerContainDrag>(); 
 | 
        if (listener == null) listener = go.AddComponent<UGUIEventListenerContainDrag>(); 
 | 
        listener.mAudioType = clickAudio; 
 | 
        return listener; 
 | 
    } 
 | 
  
 | 
    void Update() 
 | 
    { 
 | 
        //长按 
 | 
        if (OnLongPress != null && isDown && Time.realtimeSinceStartup - time > 0.8f) 
 | 
        { 
 | 
            OnLongPress(gameObject); 
 | 
            isDown = false; 
 | 
        } 
 | 
    } 
 | 
} 
 |