void MarkShowNodes(float radian, float absRadian, float maxAbsRadian, bool leaveScreen) { for (int i = 0; i < m_data.Count; i++) { float nodeRadian = i * m_radianPerNode - radian; float nodeRealRadian = nodeRadian + absRadian; if (nodeRealRadian > maxAbsRadian && leaveScreen) { continue; } VirtualListNode virtualNode = m_virtualNodes[i]; if (m_isLoop) { if (Mathf.Abs(nodeRadian) <= m_outRadian) { virtualNode.m_show = true; } } else { float r = i * m_radianPerNode - absRadian; if (Mathf.Abs(r) < m_outRadian) { virtualNode.m_show = true; } } } }
void UpdateRadian(float curRadian, bool updateData, bool leaveScreen) { if (!m_isLoop) { if (curRadian > (m_data.Count - 1) * m_radianPerNode) { curRadian = (m_data.Count - 1) * m_radianPerNode; } if (curRadian < 0) { curRadian = 0; } } float radian = GetFormalRadian(curRadian); if (!m_isLoop) { radian = curRadian; } float endRadian = GetChainEndRadian(); float maxNodeRadian = endRadian; // 先判断超出屏幕的节点 for (int i = 0; i < m_data.Count; i++) { VirtualListNode virtualNode = m_virtualNodes[i]; virtualNode.m_show = false; virtualNode.m_usedCount = 0; foreach (BowListItem item in virtualNode.m_addList) { RecollectNode(item); } virtualNode.m_addList.Clear(); } if (m_isLoop && m_data.Count == 1) { MarkShowNodes(radian + 2 * m_circleRaidan, curRadian, maxNodeRadian, leaveScreen); } // 上面的 MarkShowNodes(radian + m_circleRaidan, curRadian, maxNodeRadian, leaveScreen); if (m_isLoop) { // 中间的 MarkShowNodes(radian, curRadian, maxNodeRadian, leaveScreen); // 下面的 MarkShowNodes(radian - m_circleRaidan, curRadian, maxNodeRadian, leaveScreen); if (m_data.Count == 1) { MarkShowNodes(radian - 2 * m_circleRaidan, curRadian, maxNodeRadian, leaveScreen); } } // 先回收超出屏幕的节点,再设置出现的节点 for (int i = 0; i < m_data.Count; i++) { VirtualListNode virtualNode = m_virtualNodes[i]; if (!virtualNode.m_show) { if (virtualNode.m_item != null) { RecollectNode(virtualNode.m_item); virtualNode.m_item = null; } } } if (m_isLoop && m_data.Count == 1) { ShowNodes(radian + 2 * m_circleRaidan, curRadian, maxNodeRadian, updateData, leaveScreen); } ShowNodes(radian + m_circleRaidan, curRadian, maxNodeRadian, updateData, leaveScreen); if (m_isLoop) { ShowNodes(radian, curRadian, maxNodeRadian, updateData, leaveScreen); ShowNodes(radian - m_circleRaidan, curRadian, maxNodeRadian, updateData, leaveScreen); if (m_data.Count == 1) { ShowNodes(radian - 2 * m_circleRaidan, curRadian, maxNodeRadian, updateData, leaveScreen); } } foreach (BowChain chain in m_chains) { chain.UpdateRadian(curRadian, maxNodeRadian, leaveScreen); } foreach (BowWheel wheel in m_wheels) { wheel.SetRouteDistance(curRadian * m_radius); } }
void ShowNodes(float radian, float absRadian, float maxAbsRadian, bool updateData, bool leaveScreen) { for (int i = 0; i < m_data.Count; i++) { float nodeRadian = i * m_radianPerNode - radian; float nodeRealRadian = nodeRadian + absRadian; if (!m_isLoop) { nodeRadian = i * m_radianPerNode - absRadian; nodeRealRadian = nodeRadian; float r = i * m_radianPerNode - absRadian; if (r > m_leaveRadian || r < -m_leaveRadian) { continue; } } if (nodeRealRadian > maxAbsRadian && leaveScreen) { continue; } object data = m_data[i]; VirtualListNode virtualNode = m_virtualNodes[i]; if (Mathf.Abs(nodeRadian) > m_outRadian) { continue; } BowListItem listItem; if (virtualNode.m_usedCount == 0) { if (virtualNode.m_item == null) { virtualNode.m_item = CreateNode(); if (virtualNode.m_item == null) { Debug.LogError("list pool not big enough"); continue; } virtualNode.m_item.gameObject.name = "item" + i; virtualNode.m_item.SetData(data); } else { if (updateData) { virtualNode.m_item.gameObject.name = "item" + i; virtualNode.m_item.SetData(data); } } listItem = virtualNode.m_item; } else { listItem = CreateNode(); if (listItem == null) { Debug.LogError("list pool not big enough"); continue; } listItem.gameObject.name = "item" + i; listItem.SetData(data); virtualNode.m_addList.Add(listItem); } virtualNode.m_usedCount++; if (listItem != null) { UpdatePosition(nodeRadian, listItem); if (i == m_selectedIndex) { if (IsDifRadianShiftPlaying || IsRadianShiftPlaying) { listItem.SetSelected(false); } else { listItem.SetSelected(true); } } else { listItem.SetSelected(false); } } } }