LongPressBtn.cs 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using Fort23.UTool;
  5. using UnityEngine;
  6. using UnityEngine.EventSystems;
  7. public class LongPressBtn : MonoBehaviour, IPointerDownHandler, IPointerUpHandler, IPointerExitHandler,
  8. IPointerClickHandler
  9. {
  10. private float _time;
  11. public float startTime = 0.5f;
  12. public float intervalTime = 0.05f;
  13. public Action onClick;
  14. /// <summary>
  15. /// 连按
  16. /// </summary>
  17. public Action longPress;
  18. /// <summary>
  19. /// 长按结束
  20. /// </summary>
  21. public Action longPressEnd;
  22. /// <summary>
  23. /// 是否按下状态
  24. /// </summary>
  25. [HideInInspector] public bool isPressd;
  26. private bool _isTriggerLongPress;
  27. /// <summary>
  28. /// 是否触发了长按
  29. /// </summary>
  30. public bool isTriggerLongPress => _isTriggerLongPress;
  31. void OnPress(bool pressed)
  32. {
  33. if (pressed) // 按下
  34. {
  35. isPressd = true;
  36. }
  37. else // 松开或离开
  38. {
  39. if (isPressd)
  40. {
  41. if (_isTriggerLongPress) // 触发了长按且不是离开,执行 longPressEnd
  42. {
  43. longPressEnd?.Invoke();
  44. _isTriggerLongPress = false;
  45. }
  46. }
  47. isPressd = false;
  48. _time = 0;
  49. }
  50. }
  51. private void Update()
  52. {
  53. if (isPressd && !_isTriggerLongPress)
  54. {
  55. _time += Time.deltaTime;
  56. if (_time >= startTime)
  57. {
  58. _isTriggerLongPress = true;
  59. _time -= intervalTime;
  60. longPress?.Invoke();
  61. }
  62. }
  63. else if (isPressd && _isTriggerLongPress)
  64. {
  65. _time += Time.deltaTime;
  66. if (_time >= intervalTime)
  67. {
  68. _time -= intervalTime;
  69. longPress?.Invoke();
  70. }
  71. }
  72. }
  73. /// <summary>
  74. /// 终止
  75. /// </summary>
  76. public void Terminated()
  77. {
  78. if (isPressd)
  79. {
  80. isPressd = false;
  81. if (_isTriggerLongPress)
  82. {
  83. longPressEnd?.Invoke();
  84. }
  85. _isTriggerLongPress = false;
  86. _time = 0;
  87. }
  88. }
  89. public void OnPointerDown(PointerEventData eventData)
  90. {
  91. OnPress(true);
  92. }
  93. public void OnPointerUp(PointerEventData eventData)
  94. {
  95. OnPress(false);
  96. }
  97. public void OnPointerExit(PointerEventData eventData)
  98. {
  99. OnPress(false);
  100. }
  101. public void OnPointerClick(PointerEventData eventData)
  102. {
  103. if (!_isTriggerLongPress) // 只有未触发长按时才触发点击
  104. {
  105. onClick?.Invoke();
  106. }
  107. isPressd = false;
  108. }
  109. }