151 lines
4.0 KiB
C#
151 lines
4.0 KiB
C#
|
|
/*
|
|||
|
|
********************************************************************************
|
|||
|
|
*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 FixedUpdate ()
|
|||
|
|
{
|
|||
|
|
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;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|