DatePickerNew.cs 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242
  1. using System;
  2. using UnityEngine;
  3. using UnityEngine.EventSystems;
  4. using UnityEngine.UI;
  5. /// <summary>
  6. /// 当选择日期的委托
  7. /// </summary>
  8. public delegate void OnDateUpdate();
  9. public enum DateType
  10. {
  11. _year, _month, _day,
  12. _hour, _minute, _second
  13. }
  14. /// <summary>
  15. /// 日期选择器
  16. /// </summary>
  17. public class DatePickerNew : MonoBehaviour, IBeginDragHandler, IDragHandler, IEndDragHandler
  18. {
  19. /// <summary>
  20. /// 日期类型 (年月日时分秒)
  21. /// </summary>
  22. public DateType _dateType;
  23. /// <summary>
  24. /// 子节点数量(奇数)
  25. /// </summary>
  26. public int _itemNum = 5;
  27. [HideInInspector]
  28. /// <summary>
  29. /// 更新选择的目标值
  30. /// </summary>
  31. public float _updateLength;
  32. /// <summary>
  33. /// 子节点预制体
  34. /// </summary>
  35. public GameObject _itemObj;
  36. /// <summary>
  37. /// 子节点容器对象
  38. /// </summary>
  39. public Transform _itemParent;
  40. /// <summary>
  41. /// 我属于的日期选择组
  42. /// </summary>
  43. [HideInInspector]
  44. public DatePickerGroupNew myGroup;
  45. /// <summary>
  46. /// 当选择日期的委托事件
  47. /// </summary>
  48. public event OnDateUpdate _onDateUpdate;
  49. void Awake()
  50. {
  51. _itemObj.SetActive(false);
  52. _updateLength = _itemObj.GetComponent<RectTransform>().sizeDelta.y;
  53. }
  54. /// <summary>
  55. /// 初始化时间选择器
  56. /// </summary>
  57. public void Init()
  58. {
  59. for (int i = 0; i < _itemNum; i++)
  60. {
  61. //计算真实位置
  62. int real_i = -(_itemNum / 2) + i;
  63. SpawnItem(real_i);
  64. }
  65. RefreshDateList();
  66. }
  67. /// <summary>
  68. /// 生成子对象
  69. /// </summary>
  70. /// <param name="dataNum">对应日期</param>
  71. /// <param name="real_i">真实位置</param>
  72. /// <returns></returns>
  73. GameObject SpawnItem(float real_i)
  74. {
  75. GameObject _item = Instantiate(_itemObj);
  76. _item.SetActive(true);
  77. _item.transform.SetParent(_itemParent);
  78. _item.transform.localScale = new Vector3(1, 1, 1);
  79. _item.transform.localEulerAngles = Vector3.zero;
  80. if (real_i != 0)
  81. {
  82. _item.GetComponent<Text>().color = new Color(114 / 255f, 114 / 255f, 114 / 255f, 1 - 0.2f - (Mathf.Abs(real_i) / (_itemNum / 2 + 1)));
  83. float _scale = 1 - (Mathf.Abs(real_i) / (_itemNum / 2 + 3));
  84. _item.transform.localScale = new Vector3(_scale, _scale, _scale);
  85. }
  86. return _item;
  87. }
  88. Vector3 oldDragPos;
  89. /// <summary>
  90. /// 当开始拖拽
  91. /// </summary>
  92. /// <param name="eventData"></param>
  93. public void OnBeginDrag(PointerEventData eventData)
  94. {
  95. oldDragPos = eventData.position;
  96. }
  97. public void OnDrag(PointerEventData eventData)
  98. {
  99. //Debug.Log("拖拽");
  100. UpdateSelectDate(eventData);
  101. }
  102. public void OnEndDrag(PointerEventData eventData)
  103. {
  104. _itemParent.localPosition = Vector3.zero;
  105. }
  106. /// <summary>
  107. /// 更新选择的时间
  108. /// </summary>
  109. /// <param name="eventData"></param>
  110. void UpdateSelectDate(PointerEventData eventData)
  111. {
  112. //判断拖拽的长度是否大于目标值
  113. if (Mathf.Abs(eventData.position.y - oldDragPos.y) >= _updateLength)
  114. {
  115. int num;
  116. //判断加减
  117. if (eventData.position.y > oldDragPos.y)
  118. {
  119. //+
  120. num = 1;
  121. }
  122. else
  123. {
  124. //-
  125. num = -1;
  126. }
  127. DateTime _data = new DateTime();
  128. switch (_dateType)
  129. {
  130. case DateType._year:
  131. _data = myGroup._selectDate.AddYears(num);
  132. break;
  133. case DateType._month:
  134. _data = myGroup._selectDate.AddMonths(num);
  135. break;
  136. case DateType._day:
  137. _data = myGroup._selectDate.AddDays(num);
  138. break;
  139. case DateType._hour:
  140. _data = myGroup._selectDate.AddHours(num);
  141. break;
  142. case DateType._minute:
  143. _data = myGroup._selectDate.AddMinutes(num);
  144. break;
  145. case DateType._second:
  146. _data = myGroup._selectDate.AddSeconds(num);
  147. break;
  148. }
  149. //判断是否属于时间段
  150. if (IsInDate(_data, myGroup._minDate, myGroup._maxDate))
  151. {
  152. myGroup._selectDate = _data;
  153. oldDragPos = eventData.position;
  154. _onDateUpdate();
  155. }
  156. // _itemParent.localPosition = Vector3.zero;
  157. }
  158. else
  159. {
  160. //_itemParent.localPosition = new Vector3(0, (eventData.position.y - oldDragPos.y), 0);
  161. }
  162. }
  163. /// <summary>
  164. /// 刷新时间列表
  165. /// </summary>
  166. public void RefreshDateList()
  167. {
  168. DateTime _data = new DateTime();
  169. for (int i = 0; i < _itemNum; i++)
  170. {
  171. //计算真实位置
  172. int real_i = -(_itemNum / 2) + i;
  173. switch (_dateType)
  174. {
  175. case DateType._year:
  176. _data = myGroup._selectDate.AddYears(real_i);
  177. break;
  178. case DateType._month:
  179. _data = myGroup._selectDate.AddMonths(real_i);
  180. break;
  181. case DateType._day:
  182. _data = myGroup._selectDate.AddDays(real_i);
  183. break;
  184. case DateType._hour:
  185. _data = myGroup._selectDate.AddHours(real_i);
  186. break;
  187. case DateType._minute:
  188. _data = myGroup._selectDate.AddMinutes(real_i);
  189. break;
  190. case DateType._second:
  191. _data = myGroup._selectDate.AddSeconds(real_i);
  192. break;
  193. }
  194. string str = "";
  195. if (IsInDate(_data, myGroup._minDate, myGroup._maxDate))
  196. {
  197. switch (_dateType)
  198. {
  199. case DateType._year:
  200. str = _data.Year.ToString();
  201. break;
  202. case DateType._month:
  203. str = _data.Month.ToString();
  204. break;
  205. case DateType._day:
  206. str = _data.Day.ToString();
  207. break;
  208. case DateType._hour:
  209. str = _data.Hour.ToString();
  210. break;
  211. case DateType._minute:
  212. str = _data.Minute.ToString();
  213. break;
  214. case DateType._second:
  215. str = _data.Second.ToString();
  216. break;
  217. }
  218. }
  219. _itemParent.GetChild(i).GetComponent<Text>().text = str;
  220. }
  221. }
  222. /// <summary>
  223. /// 判断某个日期是否在某段日期范围内,返回布尔值
  224. /// </summary>
  225. /// <param name="dt">要判断的日期</param>
  226. /// <param name="dt_min">开始日期</param>
  227. /// <param name="dt_max">结束日期</param>
  228. /// <returns></returns>
  229. public bool IsInDate(DateTime dt, DateTime dt_min, DateTime dt_max)
  230. {
  231. return dt.CompareTo(dt_min) >= 0 && dt.CompareTo(dt_max) <= 0;
  232. }
  233. }