LongPressButton.cs 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. namespace SRF.UI
  2. {
  3. using Internal;
  4. using UnityEngine;
  5. [AddComponentMenu(ComponentMenuPaths.LongPressButton)]
  6. public class LongPressButton : UnityEngine.UI.Button
  7. {
  8. private bool _handled;
  9. [SerializeField] private ButtonClickedEvent _onLongPress = new ButtonClickedEvent();
  10. private bool _pressed;
  11. private float _pressedTime;
  12. public float LongPressDuration = 0.9f;
  13. public ButtonClickedEvent onLongPress
  14. {
  15. get { return _onLongPress; }
  16. set { _onLongPress = value; }
  17. }
  18. public override void OnPointerExit(UnityEngine.EventSystems.PointerEventData eventData)
  19. {
  20. base.OnPointerExit(eventData);
  21. _pressed = false;
  22. }
  23. public override void OnPointerDown(UnityEngine.EventSystems.PointerEventData eventData)
  24. {
  25. base.OnPointerDown(eventData);
  26. if (eventData.button != UnityEngine.EventSystems.PointerEventData.InputButton.Left)
  27. {
  28. return;
  29. }
  30. _pressed = true;
  31. _handled = false;
  32. _pressedTime = Time.realtimeSinceStartup;
  33. }
  34. public override void OnPointerUp(UnityEngine.EventSystems.PointerEventData eventData)
  35. {
  36. if (!_handled)
  37. {
  38. base.OnPointerUp(eventData);
  39. }
  40. _pressed = false;
  41. }
  42. public override void OnPointerClick(UnityEngine.EventSystems.PointerEventData eventData)
  43. {
  44. if (!_handled)
  45. {
  46. base.OnPointerClick(eventData);
  47. }
  48. }
  49. private void Update()
  50. {
  51. if (!_pressed)
  52. {
  53. return;
  54. }
  55. if (Time.realtimeSinceStartup - _pressedTime >= LongPressDuration)
  56. {
  57. _pressed = false;
  58. _handled = true;
  59. onLongPress.Invoke();
  60. }
  61. }
  62. }
  63. }