LongPressButton.cs 1.6 KB

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