UI_ScrollFlow.cs 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959
  1. using System;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. using UnityEngine.EventSystems;
  5. using UnityEngine.UI;
  6. using System.Collections;
  7. /// <summary>
  8. ///
  9. /// </summary>
  10. public class UI_ScrollFlow : MonoBehaviour, IBeginDragHandler, IDragHandler, IEndDragHandler
  11. {
  12. /// <summary>
  13. /// 元素初始化
  14. /// </summary>
  15. /// <param name="go"> 游戏对象 </param>
  16. /// <param name="dataIndex"> 数据索引 </param>
  17. public delegate void OnInitializeItem(GameObject go, int dataIndex);
  18. /// <summary>
  19. /// 元素初始化
  20. /// </summary>
  21. public OnInitializeItem onInitializeItem;
  22. /// <summary>
  23. /// 卡牌的像素宽度
  24. /// </summary>
  25. public float itemWidth = 700;
  26. /// <summary>
  27. /// 最大缩放
  28. /// </summary>
  29. public float MaxScale = 1.0f;
  30. /// <summary>
  31. /// 开始坐标值
  32. /// </summary>
  33. public float startValue = 0.5f;
  34. /// <summary>
  35. ///
  36. /// </summary>
  37. private int defaultItemIndex = 0;
  38. /// <summary>
  39. /// 卡牌之间的间隔坐标
  40. /// </summary>
  41. private float spaceValue = 0.2f;
  42. /// <summary>
  43. /// 移动速度曲线
  44. /// </summary>
  45. public AnimationCurve SpeedCurve;
  46. /// <summary>
  47. /// 坐标曲线
  48. /// </summary>
  49. public AnimationCurve PositionCurve;
  50. /// <summary>
  51. /// 缩放幅度大小曲线
  52. /// </summary>
  53. public AnimationCurve ScaleCurve;
  54. /// <summary>
  55. /// 拖拽时候的,托主幅度量
  56. /// </summary>
  57. private float dragV = 0;
  58. /// <summary>
  59. /// 拖拽时候的,计算值
  60. /// </summary>
  61. private Vector2 start_point, add_vect;
  62. /// <summary>
  63. /// 移动结束事件
  64. /// </summary>
  65. public event CallBack<UI_ScrollFlow_Item> MoveEnd;
  66. /// <summary>
  67. /// 更改当前卡牌的状态
  68. /// </summary>
  69. public event CallBack<bool, UI_ScrollFlow_Item> EventRefreshCardState;
  70. /// <summary>
  71. /// 是否开启动画
  72. /// </summary>
  73. public bool _anim = false;
  74. /// <summary>
  75. /// 移动的量
  76. /// </summary>
  77. private float AddV = 0;
  78. /// <summary>
  79. /// 移动方向
  80. /// </summary>
  81. private float Vk = 0;
  82. /// <summary>
  83. ///
  84. /// </summary>
  85. private float Vtotal = 0;
  86. /// <summary>
  87. /// 动画速度 * 单位时间* 移动方向,计算出来的移动值
  88. /// </summary>
  89. private float CurrentV = 0;
  90. /// <summary>
  91. ///
  92. /// </summary>
  93. private float VT = 0;
  94. /// <summary>
  95. ///
  96. /// </summary>
  97. private float _v1 = 0, _v2 = 0;
  98. /// <summary>
  99. /// 动画速度
  100. /// </summary>
  101. public float _anim_speed = 1f;
  102. /// <summary>
  103. ///
  104. /// </summary>
  105. public UI_ScrollFlow_Item Current;
  106. /// <summary>
  107. /// 初始化
  108. /// </summary>
  109. /// <param name="dataCount"> 数据的数量 </param>
  110. public void Init(int dataCount)
  111. {
  112. // 不显示元素预制物体
  113. goItemPrefab.SetActive(false);
  114. // 如果数据数量为 0 ,没有初始化的必要
  115. if (dataCount <= 0)
  116. {
  117. return;
  118. }
  119. mDataCount = dataCount;
  120. unUseItem.Clear();
  121. useItemList.Clear();
  122. Debug.LogError("Init!!!!!" + useItemList.Count);
  123. setUpdateRectItem(0, true);
  124. }
  125. /// <summary>
  126. /// 初始化 英雄滑动列表的组件设置
  127. /// </summary>
  128. public void InitHeroComponmentsSetting()
  129. {
  130. MaxScale = 1.0f;
  131. itemWidth = 500;
  132. float[] tixxx = new float[] { -0.95f, -0.59f, -0.23f, 0.13f, 0.5f, 0.87f, 1.23f, 1.59f, 1.95f };
  133. Keyframe[] ks = new Keyframe[3];
  134. ks[0] = new Keyframe(0, 0.9f);
  135. ks[1] = new Keyframe(0.5f, 1.0f);
  136. ks[2] = new Keyframe(1.0f, 0.9f);
  137. ScaleCurve = new AnimationCurve(ks);
  138. Keyframe[] spks = new Keyframe[5];
  139. spks[0] = new Keyframe(-1.0f, 2.0f);
  140. spks[1] = new Keyframe(-0.5f, 1.5f);
  141. spks[2] = new Keyframe(0, 0.5f);
  142. spks[3] = new Keyframe(0.5f, 1.5f);
  143. spks[4] = new Keyframe(1.0f, 2.0f);
  144. SpeedCurve = new AnimationCurve(spks);
  145. Keyframe[] posArr = new Keyframe[tixxx.Length];
  146. int index = 0;
  147. for (int i = -4; i <= 4; i++)
  148. {
  149. posArr[index] = new Keyframe(startValue + i * spaceValue, tixxx[index]);
  150. index++;
  151. }
  152. PositionCurve = new AnimationCurve(posArr);
  153. }
  154. /// <summary>
  155. /// 初始化 图鉴滑动列表的组件设置
  156. /// </summary>
  157. public void InitBook_ComponmentsSetting()
  158. {
  159. MaxScale = 1.0f;
  160. itemWidth = 200;
  161. Keyframe[] spks = new Keyframe[5];
  162. spks[0] = new Keyframe(-1.0f, 1.5f);
  163. spks[1] = new Keyframe(-0.5f, 1);
  164. spks[2] = new Keyframe(0, 0.5f);
  165. spks[3] = new Keyframe(0.5f, 1);
  166. spks[4] = new Keyframe(1.0f, 1.5f);
  167. SpeedCurve = new AnimationCurve(spks);
  168. Keyframe[] ks = new Keyframe[2];
  169. ks[0] = new Keyframe(-1.0f, 1.0f);
  170. ks[1] = new Keyframe(1.0f, 1.0f);
  171. ScaleCurve = new AnimationCurve(ks);
  172. float[] tixxx = new float[] { -3.0f, -2.0f, -1.0f, 0, 1.0f, 2.0f, 3.0f };
  173. Keyframe[] posArr = new Keyframe[tixxx.Length];
  174. int index = 0;
  175. for (int i = -3; i <= 3; i++)
  176. {
  177. posArr[index] = new Keyframe(startValue + i * spaceValue, tixxx[index]);
  178. index++;
  179. }
  180. PositionCurve = new AnimationCurve(posArr);
  181. }
  182. /// <summary>
  183. ///
  184. /// </summary>
  185. public void InitPvp_ComponmentsSetting()
  186. {
  187. MaxScale = 1.0f;
  188. itemWidth = 800;
  189. Keyframe[] spks = new Keyframe[5];
  190. spks[0] = new Keyframe(-1.0f, 1.5f);
  191. spks[1] = new Keyframe(-0.5f, 1);
  192. spks[2] = new Keyframe(0, 0.5f);
  193. spks[3] = new Keyframe(0.5f, 1);
  194. spks[4] = new Keyframe(1.0f, 1.5f);
  195. SpeedCurve = new AnimationCurve(spks);
  196. Keyframe[] ks = new Keyframe[3];
  197. ks[0] = new Keyframe(0, 0.9f);
  198. ks[1] = new Keyframe(0.5f, 1.0f);
  199. ks[2] = new Keyframe(1.0f, 0.9f);
  200. ScaleCurve = new AnimationCurve(ks);
  201. float[] tixxx = new float[] { -3.0f, -2.0f, -1.0f, 0, 1.0f, 2.0f, 3.0f };
  202. Keyframe[] posArr = new Keyframe[tixxx.Length];
  203. int index = 0;
  204. for (int i = -3; i <= 3; i++)
  205. {
  206. posArr[index] = new Keyframe(startValue + i * spaceValue, tixxx[index]);
  207. index++;
  208. }
  209. PositionCurve = new AnimationCurve(posArr);
  210. }
  211. /// <summary>
  212. /// 当前处于选中的对象数据索引
  213. /// </summary>
  214. public int CurSelectElementIndex = -1;
  215. /// <summary>
  216. /// 接手到通知,某个子对象的选中状态发生改变了
  217. /// </summary>
  218. public void OnReceiveUpdateState(bool isSelected, UI_ScrollFlow_Item item)
  219. {
  220. if (isSelected)
  221. {
  222. if (CurSelectElementIndex != item.Index)
  223. {
  224. CurSelectElementIndex = item.Index;
  225. RefreshDraw();
  226. }
  227. }
  228. if (EventRefreshCardState != null)
  229. {
  230. EventRefreshCardState(isSelected, item);
  231. }
  232. }
  233. /// <summary>
  234. /// 当前元素总值
  235. /// </summary>
  236. public int mDataCount;
  237. /// <summary>
  238. /// 上次定位的位置
  239. /// </summary>
  240. private int _lastCurIndex;
  241. /// <summary>
  242. ///
  243. /// </summary>
  244. private int lastCurIndex
  245. {
  246. get { return _lastCurIndex; }
  247. set
  248. {
  249. if (_lastCurIndex != value)
  250. {
  251. _lastCurIndex = value;
  252. }
  253. }
  254. }
  255. /// <summary>
  256. ///
  257. /// </summary>
  258. private int curIndex = 0;
  259. /// <summary>
  260. /// 英雄列表滑动的数据发生变化
  261. /// </summary>
  262. public void Hero_DataChanged(int dataCount, bool bResetPos)
  263. {
  264. CurSelectElementIndex = -1;
  265. Current = null;
  266. mDataCount = dataCount;
  267. if (bResetPos)
  268. {
  269. //if (mDataCount > 5)
  270. //{
  271. // defaultItemIndex = 5;
  272. //}
  273. //else
  274. //{
  275. // defaultItemIndex = mDataCount - 1;
  276. //}
  277. //lastCurIndex = defaultItemIndex;
  278. }
  279. //// Debug.LogError("bResetPos:::" + bResetPos + " lastCurIndex:: " + lastCurIndex);
  280. /*
  281. * 如果需要重新定位的话
  282. * 重新计算每个数据在时间轴的位置
  283. */
  284. // 因为数据改变了,元素要重新获取数据
  285. for (int i = useItemList.Count - 1; i >= 0; i--)
  286. {
  287. UI_ScrollFlow_Item item = useItemList[i];
  288. item.Index = -1;
  289. useItemList.Remove(item);
  290. unUseItem.Enqueue(item);
  291. }
  292. //// Debug.LogError("DataChanged!!!!!" + useItemList.Count);
  293. setUpdateRectItem(lastCurIndex, true);
  294. //////if (bResetPos)
  295. //////{
  296. ////// if (useItemList.Count > 0)
  297. ////// {
  298. ////// UI_ScrollFlow_Item script = useItemList[0];
  299. ////// if (script == null)
  300. ////// {
  301. ////// return;
  302. ////// }
  303. ////// if (Current != script)
  304. ////// {
  305. ////// //// Debug.LogError("Current 0.5fIndex:::" + Current.Index + " script:: " + script.Index);
  306. ////// ToAppointedItem(script);
  307. ////// }
  308. ////// }
  309. //////}
  310. //////else
  311. //////{
  312. ////// UI_ScrollFlow_Item script = null;
  313. ////// //// Debug.LogError(" lastCurIndex:: " + lastCurIndex + " useItemList count::: " + useItemList.Count);
  314. ////// if (useItemList.Count > 0)
  315. ////// {
  316. ////// if (lastCurIndex >= useItemList.Count)
  317. ////// {
  318. ////// script = useItemList[useItemList.Count - 1];
  319. ////// }
  320. ////// else
  321. ////// {
  322. ////// script = useItemList[lastCurIndex];
  323. ////// }
  324. ////// }
  325. ////// if (script != null)
  326. ////// {
  327. ////// //// Debug.LogError("0.5fIndex:::script:: " + script.Index);
  328. ////// ToAppointedItem(script);
  329. ////// }
  330. //////}
  331. if (Current != null)
  332. {
  333. ToAppointedItem(Current);
  334. }
  335. RefreshDraw();
  336. }
  337. /// <summary>
  338. /// 图鉴的数据发生变化
  339. /// </summary>
  340. public void Book_DataChanged(int dataCount)
  341. {
  342. Current = null;
  343. mDataCount = dataCount;
  344. lastCurIndex = 2;
  345. /*
  346. * 如果需要重新定位的话
  347. * 重新计算每个数据在时间轴的位置
  348. */
  349. // 因为数据改变了,元素要重新获取数据
  350. for (int i = useItemList.Count - 1; i >= 0; i--)
  351. {
  352. UI_ScrollFlow_Item item = useItemList[i];
  353. item.Index = -1;
  354. useItemList.Remove(item);
  355. unUseItem.Enqueue(item);
  356. }
  357. setUpdateRectItem(lastCurIndex, true);
  358. UI_ScrollFlow_Item script = null;
  359. if (useItemList.Count > 0)
  360. {
  361. if (lastCurIndex >= useItemList.Count)
  362. {
  363. script = useItemList[useItemList.Count - 1];
  364. }
  365. else
  366. {
  367. script = useItemList[lastCurIndex];
  368. }
  369. }
  370. if (script != null)
  371. {
  372. ToAppointedItem(script);
  373. }
  374. }
  375. #region
  376. /// <summary>
  377. /// 刷新元素
  378. /// </summary>
  379. /// <param name="scrollPerLineIndex"> 当前所处的行数 </param>
  380. private void setUpdateRectItem(int scrollPerLineIndex, bool isNeedFindCurrent = false)
  381. {
  382. if (scrollPerLineIndex < 0)
  383. {
  384. return;
  385. }
  386. int startDataIndex = 0;
  387. int endDataIndex = mDataCount;
  388. // 移除
  389. for (int i = useItemList.Count - 1; i >= 0; i--)
  390. {
  391. UI_ScrollFlow_Item item = useItemList[i];
  392. int index = item.Index;
  393. if (index < startDataIndex || index >= endDataIndex)
  394. {
  395. item.Index = -1;
  396. useItemList.Remove(item);
  397. unUseItem.Enqueue(item);
  398. }
  399. }
  400. // 显示
  401. for (int dataIndex = startDataIndex; dataIndex < endDataIndex; dataIndex++)
  402. {
  403. if (dataIndex < 0)
  404. {
  405. continue;
  406. }
  407. if (dataIndex >= mDataCount)
  408. {
  409. continue;
  410. }
  411. if (isExistDataByDataIndex(dataIndex))
  412. {
  413. //需要重置下坐标位置
  414. continue;
  415. }
  416. ////StartCoroutine(createItem(dataIndex, isNeedFindCurrent));
  417. createItem(dataIndex, isNeedFindCurrent);
  418. }
  419. }
  420. private int tempStartIndex = 0;
  421. private int tempEndIndex = 0;
  422. /// <summary>
  423. /// content 对象
  424. /// </summary>
  425. public RectTransform nodeContent = null;
  426. /// <summary>
  427. /// 元素预制物体
  428. /// </summary>
  429. public GameObject goItemPrefab = null;
  430. /// <summary>
  431. /// 创建元素
  432. /// </summary>
  433. /// <param name="dataIndex"> 数据索引 </param>
  434. private void createItem(int dataIndex, bool isNeedFindCurrent)
  435. {
  436. UI_ScrollFlow_Item item = null;
  437. if (unUseItem.Count > 0)
  438. {
  439. item = unUseItem.Dequeue();
  440. }
  441. else
  442. {
  443. GameObject temp = addChild(goItemPrefab, nodeContent);
  444. item = temp.GetComponent<UI_ScrollFlow_Item>();
  445. if (item == null)
  446. {
  447. AssemblyHelper.Instance.BindScript("UI_ScrollFlow_Item", temp);
  448. item = temp.GetComponent<UI_ScrollFlow_Item>();
  449. }
  450. }
  451. item.gameObject.name = dataIndex.ToString();
  452. item.gameObject.SetActive(true);
  453. item.ScrollFlowParent = this;
  454. item.Index = dataIndex;
  455. useItemList.Add(item);
  456. float dv = startValue + (dataIndex - lastCurIndex) * spaceValue;
  457. //// Debug.LogError("dv !!!!!" + dv);
  458. item.Drag(dv);
  459. if (isNeedFindCurrent)
  460. {
  461. if (Mathf.Abs(dv - startValue) < 0.05f)
  462. {
  463. Current = item;
  464. }
  465. }
  466. ////yield return null;
  467. }
  468. /// <summary>
  469. /// 当前数据是否存在 List 中
  470. /// </summary>
  471. /// <param name="dataIndex"> 数据索引 </param>
  472. /// <returns> 是否已存在 </returns>
  473. private bool isExistDataByDataIndex(int dataIndex, bool isNeedFindCurrent = false)
  474. {
  475. if (useItemList == null || useItemList.Count <= 0)
  476. {
  477. return false;
  478. }
  479. for (int i = 0; i < useItemList.Count; i++)
  480. {
  481. if (useItemList[i].Index == dataIndex)
  482. {
  483. return true;
  484. }
  485. }
  486. return false;
  487. }
  488. /// <summary>
  489. /// 实例化预设对象 、添加实例化对象到指定的子对象下
  490. /// </summary>
  491. /// <param name="goPrefab"> 元素预制物体 </param>
  492. /// <param name="parent"> 父节点 </param>
  493. /// <returns> 新创建的元素对象 </returns>
  494. private GameObject addChild(GameObject goPrefab, Transform parent)
  495. {
  496. if (goPrefab == null || parent == null)
  497. {
  498. Debug.LogError("异常。UIWarpContent.cs addChild(goPrefab = null || parent = null)");
  499. return null;
  500. }
  501. GameObject goChild = GameObject.Instantiate(goPrefab) as GameObject;
  502. goChild.transform.SetParent(parent, false);
  503. goChild.SetActive(true);
  504. return goChild;
  505. }
  506. /// <summary>
  507. /// 正在使用中的元素
  508. /// </summary>
  509. private List<UI_ScrollFlow_Item> useItemList = new List<UI_ScrollFlow_Item>();
  510. /// <summary>
  511. /// 未在使用中的元素
  512. /// </summary>
  513. private Queue<UI_ScrollFlow_Item> unUseItem = new Queue<UI_ScrollFlow_Item>();
  514. /// <summary>
  515. /// 销毁
  516. /// </summary>
  517. private void OnDestroy()
  518. {
  519. nodeContent = null;
  520. goItemPrefab = null;
  521. onInitializeItem = null;
  522. useItemList.Clear();
  523. unUseItem.Clear();
  524. useItemList = null;
  525. unUseItem = null;
  526. }
  527. #endregion
  528. /// <summary>
  529. ///
  530. /// </summary>
  531. /// <param name="eventData"></param>
  532. public void OnBeginDrag(PointerEventData eventData)
  533. {
  534. start_point = eventData.position;
  535. add_vect = Vector3.zero;
  536. _anim = false;
  537. }
  538. /// <summary>
  539. ///
  540. /// </summary>
  541. /// <param name="eventData"></param>
  542. public void OnDrag(PointerEventData eventData)
  543. {
  544. //判断此时 是不是已经到列表尽头,然后做一个极限设定
  545. if (useItemList[0].v > startValue)
  546. {
  547. float abs = Mathf.Abs(startValue - useItemList[0].v);
  548. if (abs > spaceValue)
  549. {
  550. return;
  551. }
  552. }
  553. if (useItemList[useItemList.Count - 1].v < startValue)
  554. {
  555. float abs = Mathf.Abs(startValue - useItemList[useItemList.Count - 1].v);
  556. if (abs > spaceValue)
  557. {
  558. return;
  559. }
  560. }
  561. add_vect = eventData.position - start_point;
  562. dragV = eventData.delta.x * 1.00f / itemWidth;
  563. //计算移动量,对应卡牌的比例
  564. for (int i = 0; i < useItemList.Count; i++)
  565. {
  566. useItemList[i].Drag(dragV);
  567. }
  568. }
  569. /// <summary>
  570. /// 这块需要调整
  571. /// 要不然不知道拖拽到哪个了......................
  572. /// </summary>
  573. /// <param name="eventData"></param>
  574. public void OnEndDrag(PointerEventData eventData)
  575. {
  576. float k = 0, v1;
  577. for (int i = 0; i < useItemList.Count; i++)
  578. {
  579. if (useItemList[i].v >= startValue)
  580. {
  581. v1 = (useItemList[i].v - startValue) % spaceValue;
  582. if (add_vect.x >= 0)
  583. {
  584. k = spaceValue - v1;
  585. //确定向右移动 ()
  586. }
  587. else
  588. {
  589. k = v1 * -1;
  590. }
  591. break;
  592. }
  593. }
  594. add_vect = Vector3.zero;
  595. // 判断是否拖拽到极限
  596. if (useItemList[0].v > startValue)
  597. {
  598. //说明向右滑道头了
  599. k = useItemList[0].v;
  600. k = startValue - k;
  601. AnimToEnd(k);
  602. return;
  603. }
  604. if (useItemList[useItemList.Count - 1].v < startValue)
  605. {
  606. k = useItemList[useItemList.Count - 1].v;
  607. k = startValue - k;
  608. AnimToEnd(k);
  609. return;
  610. }
  611. AnimToEnd(k);
  612. }
  613. /// <summary>
  614. ///
  615. /// </summary>
  616. /// <param name="v"></param>
  617. /// <returns></returns>
  618. public float GetPositionX(float v, int _index)
  619. {
  620. //return v * itemWidth;
  621. return PositionCurve.Evaluate(v) * itemWidth;
  622. }
  623. /// <summary>
  624. /// 获取卡牌移动速度
  625. /// </summary>
  626. /// <param name="v"></param>
  627. /// <returns></returns>
  628. public float GetMoveSpeed(float v)
  629. {
  630. //return v * itemWidth;
  631. return SpeedCurve.Evaluate(v) * 1.0f;
  632. }
  633. /// <summary>
  634. ///
  635. /// </summary>
  636. /// <param name="v"></param>
  637. /// <returns></returns>
  638. public float GetScale(float v)
  639. {
  640. return ScaleCurve.Evaluate(v) * MaxScale;
  641. }
  642. /// <summary>
  643. /// 主要进行排序
  644. /// 除了中间之外的, 左侧的,从左到右绘制.
  645. /// 中间右侧,从右到左绘制
  646. /// </summary>
  647. public void LateUpdate()
  648. {
  649. if (!IsOPenReDraw)
  650. {
  651. return;
  652. }
  653. List<UI_ScrollFlow_Item> left = new List<UI_ScrollFlow_Item>();
  654. List<UI_ScrollFlow_Item> right = new List<UI_ScrollFlow_Item>();
  655. List<UI_ScrollFlow_Item> middle = new List<UI_ScrollFlow_Item>();
  656. int index = 0;
  657. // Debug.LogError("LateUpdate:::" + useItemList.Count);
  658. for (int i = 0; i < useItemList.Count; i++)
  659. {
  660. float abs = Mathf.Abs(startValue - useItemList[i].v);
  661. if (abs < 0.05f)
  662. {
  663. middle.Add(useItemList[i]);
  664. }
  665. else
  666. {
  667. if (useItemList[i].v > startValue)
  668. {
  669. right.Add(useItemList[i]);
  670. }
  671. else
  672. {
  673. left.Add(useItemList[i]);
  674. }
  675. }
  676. }
  677. ////按照 顺序重新绘制 左侧 索引 右侧绘制从大到小
  678. left.Sort(sortByIndex);
  679. right.Sort(sortByIndex);
  680. for (int i = 0; i < left.Count; i++)
  681. {
  682. left[i].rect.SetSiblingIndex(index);
  683. index++;
  684. }
  685. for (int i = right.Count - 1; i >= 0; i--)
  686. {
  687. right[i].rect.SetSiblingIndex(index);
  688. index++;
  689. }
  690. for (int i = 0; i < middle.Count; i++)
  691. {
  692. middle[i].rect.SetSiblingIndex(index);
  693. index++;
  694. }
  695. IsOPenReDraw = false;
  696. }
  697. private bool IsOPenReDraw = false;
  698. /// <summary>
  699. ///
  700. /// </summary>
  701. public void RefreshDraw()
  702. {
  703. // 停止创建元素
  704. ////StopCoroutine("ReDraw");
  705. ////StartCoroutine("ReDraw");
  706. IsOPenReDraw = true;
  707. }
  708. ////private IEnumerator ReDraw()
  709. ////{
  710. //// Dictionary<int, UI_ScrollFlow_Item> xx = new Dictionary<int, UI_ScrollFlow_Item>();
  711. //// foreach (UI_ScrollFlow_Item ele in useItemList)
  712. //// {
  713. //// xx.Add(ele.ResetSiblingIndex(), ele);
  714. //// }
  715. //// List<int> temp = new List<int>();
  716. //// temp.AddRange(xx.Keys);
  717. //// temp.Sort();
  718. //// temp.Reverse();
  719. //// foreach (int key in temp)
  720. //// {
  721. //// xx[key].rect.SetAsLastSibling();
  722. //// }
  723. //// yield return null;
  724. ////}
  725. private int sortByIndex(UI_ScrollFlow_Item item1, UI_ScrollFlow_Item item2)
  726. {
  727. int result = 0;
  728. if (item1.Index > item2.Index)
  729. {
  730. result = 1;
  731. }
  732. else if (item1.Index < item2.Index)
  733. {
  734. result = -1;
  735. }
  736. return result;
  737. }
  738. /// <summary>
  739. /// 移动结束
  740. /// </summary>
  741. /// <param name="k">移动距离</param>
  742. public void AnimToEnd(float k)
  743. {
  744. AddV = k;
  745. if (AddV > 0)
  746. {
  747. Vk = 1;
  748. }
  749. else if (AddV < 0)
  750. {
  751. Vk = -1;
  752. }
  753. else
  754. {
  755. return;
  756. }
  757. Vtotal = 0;
  758. _anim_speed = GetMoveSpeed(k);
  759. _anim = true;
  760. }
  761. /// <summary>
  762. ///
  763. /// </summary>
  764. private void Update()
  765. {
  766. if (_anim)
  767. {
  768. CurrentV = Time.deltaTime * _anim_speed * Vk;
  769. ////通过update 来累加 CurrentV;
  770. ////直到移动量,达到要求的结束动画.
  771. ////主要对点击某个卡牌,移动直到显示某个具体位置卡牌有效.
  772. VT = Vtotal + CurrentV;
  773. if (Vk > 0 && VT >= AddV)
  774. {
  775. _anim = false;
  776. CurrentV = AddV - Vtotal;
  777. }
  778. if (Vk < 0 && VT <= AddV)
  779. {
  780. _anim = false;
  781. CurrentV = AddV - Vtotal;
  782. }
  783. ////=============================================
  784. for (int i = 0; i < useItemList.Count; i++)
  785. {
  786. useItemList[i].Drag(CurrentV);
  787. if (useItemList[i].v - startValue < 0.05f)
  788. {
  789. Current = useItemList[i];
  790. }
  791. }
  792. Vtotal = VT;
  793. if (!_anim)
  794. {
  795. lastCurIndex = Current.Index;
  796. //setUpdateRectItem(lastCurIndex);
  797. if (MoveEnd != null)
  798. {
  799. MoveEnd(Current);
  800. }
  801. }
  802. }
  803. }
  804. /// <summary>
  805. /// 转到指定子对象显示
  806. /// </summary>
  807. /// <param name="script"></param>
  808. public void ToAppointedItem(UI_ScrollFlow_Item script)
  809. {
  810. if (script == null)
  811. return;
  812. float k = script.v;
  813. k = startValue - k;
  814. AnimToEnd(k);
  815. }
  816. }