Files
tianrunCRM/Assets/CoolapeFrame/Scripts/ui/NguiExtend/UIMoveToCell.cs
2020-07-10 13:22:24 +08:00

151 lines
4.0 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
********************************************************************************
*Copyright(C),coolae.net
*Author: chenbin
*Version: 2.0
*Date: 2017-01-09
*Description: 移动列表显示指定的单元
* 注意将该脚本绑在grid层
*Others:
*History:
*********************************************************************************
*/
using UnityEngine;
using System.Collections;
namespace Coolape
{
public class UIMoveToCell : MonoBehaviour
{
public float speed = 1.5f;
public AnimationCurve moveCurve = new AnimationCurve (new Keyframe (0, 0), new Keyframe (1, 1));
Vector3 fromListPos = Vector3.zero;
// Vector4 fromClipRage = Vector4.zero;
Vector2 fromOffset = Vector2.zero;
Vector3 toListPos = Vector3.zero;
// Vector4 toClipRage = Vector4.zero;
Vector2 toOffset = Vector2.zero;
Vector3 diffListPos = Vector3.zero;
Vector2 diffOffset = Vector4.zero;
bool isMoveToNow = false;
object finishCallback;
UIGrid _grid;
UIGrid grid {
get {
if (_grid == null) {
_grid = GetComponent<UIGrid> ();
}
return _grid;
}
}
UIPanel _panelList;
UIPanel panelList {
get {
if (_panelList == null && grid != null) {
_panelList = grid.transform.parent.GetComponent<UIPanel> ();
}
return _panelList;
}
}
float times = 0;
// Update is called once per frame
void Update ()
{
if (isMoveToNow) {
times += speed * Time.unscaledDeltaTime;
if (times > 1) {
times = 1;
isMoveToNow = false;
Utl.doCallback (finishCallback, this);
}
panelList.transform.localPosition = fromListPos + diffListPos * moveCurve.Evaluate (times);
panelList.clipOffset = fromOffset + diffOffset * moveCurve.Evaluate (times);
}
}
/// <summary>
/// Moves the list show specific cell.
/// </summary>移动列表显示指定的单元
/// <param name='parentOfCell'>
/// Parent of cell.
/// </param>
/// <param name='specificCell'>
/// Specific cell.指定的单元
/// </param>
/// <param name='arrangeMent'>
/// Arrange ment. 1水平滑动 2垂直滑动
/// </param>
public void moveTo (GameObject specificCell, bool isReverse)
{
if (grid == null || panelList == null || specificCell == null) {
return;
}
int index = 0;
try {
index = int.Parse (specificCell.name);
} catch {
return;
}
moveTo (index, isReverse, false);
}
public void moveTo (int index, bool isReverse, bool reset, object finishCallback = null)
{
this.finishCallback = finishCallback;
int flag = 1;
if (isReverse) {
flag = -1;
}
if (grid == null || panelList == null) { // || index < 0) {
return;
}
if (reset)
grid.resetPosition ();
Vector4 clip = panelList.baseClipRegion;
Vector2 newOffset = panelList.clipOffset;
Vector3 newListPos = panelList.transform.localPosition;
fromOffset = newOffset;
fromListPos = newListPos;
newOffset = grid.oldParentClipOffset;
newListPos = grid.oldParentPos;
float cellSize = 0;
int cellMaxPerLine = grid.maxPerLine;
cellMaxPerLine = cellMaxPerLine == 0 ? 1 : cellMaxPerLine;
if ((grid.arrangement == UIGrid.Arrangement.Horizontal && cellMaxPerLine == 1) ||
(grid.arrangement == UIGrid.Arrangement.Vertical && cellMaxPerLine > 1)) {
cellSize = grid.cellWidth;
float x = flag * (index / cellMaxPerLine) * cellSize;
if ((grid.Count () / cellMaxPerLine) * cellSize < clip.z) {
return;
}
newListPos.x = grid.oldParentPos.x - x;
newOffset.x = grid.oldParentClipOffset.x + x;
} else {
cellSize = grid.cellHeight;
float y = flag * (index / cellMaxPerLine) * cellSize;
if ((grid.Count () / cellMaxPerLine) * cellSize < clip.w) {
return;
}
// newListPos.y += y;
// newClipRage.y -= y;
newListPos.y = grid.oldParentPos.y + y;
newOffset.y = grid.oldParentClipOffset.y - y;
}
toListPos = newListPos;
toOffset = newOffset;
diffListPos = toListPos - fromListPos;
diffOffset = toOffset - fromOffset;
times = 0;
isMoveToNow = true;
}
}
}