Files
tianrunCRM/Assets/CoolapeFrame/Scripts/ui/NguiExtend/UIGridPage.cs
2020-07-04 14:41:25 +08:00

412 lines
11 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: wangkaiyuan
*Version: 2.0
*Date: 2017-01-09
*Description: 滑动页面,比如可以用在关卡地图页面
* 注意使用时每个page都要继承UIDragPageContents(如果是lua时可以直接使用UIDragPage4Lua)
*Others:
*History:
*********************************************************************************
*/
using UnityEngine;
using System.Collections;
using XLua;
namespace Coolape
{
[ExecuteInEditMode]
[RequireComponent (typeof(UIMoveToCell))]
public class UIGridPage : UIGrid
{
int cacheNum = 3;
public bool isLimitless = false;
//缓存数
public bool isReverse = false;
public float dragSensitivity = 10f;
//拖动敏感度
public UIDragPageContents page1;
public UIDragPageContents page2;
public UIDragPageContents page3;
[HideInInspector]
public int currCell = 0;
int oldCurrCell = -1;
UIMoveToCell _moveToCell;
public LoopPage currPage;
LoopPage pages;
bool canDrag = true;
int flag = 1;
UIScrollView _scrollView;
public UIScrollView scrollView {
get {
if (_scrollView == null) {
_scrollView = GetComponent<UIScrollView> ();
if (_scrollView == null) {
_scrollView = transform.parent.GetComponent<UIScrollView> ();
}
}
return _scrollView;
}
}
public class LoopPage
{
public UIDragPageContents data;
public LoopPage prev;
public LoopPage next;
}
bool isFinishInit = false;
public override void Start ()
{
if (isFinishInit) {
return;
}
base.Start ();
_init ();
}
void _init ()
{
if (isFinishInit) {
return;
}
isFinishInit = true;
dragSensitivity = dragSensitivity <= 0 ? 1 : dragSensitivity;
pages = new LoopPage ();
pages.data = page1;
pages.next = new LoopPage ();
pages.next.data = page2;
pages.next.next = new LoopPage ();
pages.next.next.data = page3;
pages.next.next.next = pages;
pages.prev = pages.next.next;
pages.next.prev = pages;
pages.next.next.prev = pages.next;
currPage = pages;
}
public UIMoveToCell moveToCell {
get {
if (_moveToCell == null) {
_moveToCell = GetComponent<UIMoveToCell> ();
}
return _moveToCell;
}
}
object data;
object[] dataList;
object onRefreshCurrentPage;
/// <summary>
/// Init the specified pageList, initPage, initCell and defalt.初始化滑动页面
/// </summary>
/// <param name="pageList">Page list.
/// 数据是list里面套list外层list是页面的数据内层的数据是每个页面里面的数据
/// </param>
/// <param name="onRefreshCurrentPage">onRefreshCurrentPage.
/// 当显示当前page时的回调
/// </param>
/// <param name="defaltPage">defaltPage.
/// 初始化时默认页0表示第一页1表示第2页
/// </param>
public void init (object pageList, object onRefreshCurrentPage, int defaltPage)
{
if (pageList == null) {
Debug.LogError ("Data is null");
return;
}
_initList (pageList, onRefreshCurrentPage, defaltPage);
}
void _initList (object data, object onRefreshCurrentPage, int defaltPage)
{
Start ();
canDrag = true;
if (isReverse) {
flag = -1;
}
object[] list = null;
if (data is LuaTable) {
ArrayList _list = CLUtlLua.luaTableVals2List ((LuaTable)data);
list = _list.ToArray ();
_list.Clear ();
_list = null;
} else if (data is ArrayList) {
list = ((ArrayList)data).ToArray ();
}
this.data = data;
this.dataList = list;
this.onRefreshCurrentPage = onRefreshCurrentPage;
if (defaltPage >= list.Length || defaltPage < 0) {
return;
}
currCell = defaltPage;
initCellPos (currCell);
}
void initCellPos (int index)
{
NGUITools.SetActive (page1.gameObject, true);
NGUITools.SetActive (page2.gameObject, true);
NGUITools.SetActive (page3.gameObject, true);
Update ();
repositionNow = true;
Update ();
currPage = pages;
int pageCount = dataList.Length;
if (pageCount <= 3) {
#region
//此段处理是为了让ngpc这种三个页面显示的数据不同的那种让三个页面的位置固定
switch (currCell) {
case 0:
currPage = pages;
NGUITools.SetActive (page1.gameObject, true);
break;
case 1:
currPage = pages.next;
break;
case 2:
currPage = pages.prev;
break;
default:
break;
}
switch (pageCount) {
case 1:
NGUITools.SetActive (page1.gameObject, true);
NGUITools.SetActive (page2.gameObject, false);
NGUITools.SetActive (page3.gameObject, false);
break;
case 2:
NGUITools.SetActive (page1.gameObject, true);
NGUITools.SetActive (page2.gameObject, true);
NGUITools.SetActive (page3.gameObject, false);
break;
case 3:
NGUITools.SetActive (page1.gameObject, true);
NGUITools.SetActive (page2.gameObject, true);
NGUITools.SetActive (page3.gameObject, true);
break;
default:
NGUITools.SetActive (page1.gameObject, false);
NGUITools.SetActive (page2.gameObject, false);
NGUITools.SetActive (page3.gameObject, false);
break;
}
#endregion
} else {
Vector3 toPos = Vector3.zero;
if (arrangement == UIGrid.Arrangement.Horizontal) {
toPos.x = flag * cellWidth * (index);
currPage.data.transform.localPosition = toPos;
toPos.x = flag * cellWidth * (index - 1);
currPage.prev.data.transform.localPosition = toPos;
toPos.x = flag * cellWidth * (index + 1);
currPage.next.data.transform.localPosition = toPos;
} else {
toPos.y = -flag * cellHeight * index;
currPage.data.transform.localPosition = toPos;
toPos.y = -flag * cellHeight * (index - 1);
currPage.prev.data.transform.localPosition = toPos;
toPos.y = -flag * cellHeight * (index + 1);
currPage.next.data.transform.localPosition = toPos;
}
}
oldCurrCell = currCell;
moveToCell.moveTo (index, isReverse, false);
//刷新数据
if (currCell <= 0) {
NGUITools.SetActive (currPage.prev.data.gameObject, false);
}
if (currCell - 1 >= 0 && currCell - 1 < pageCount) {
currPage.prev.data.init (dataList [currCell - 1], currCell - 1);//刷新数据
} else {
currPage.prev.data.init (null, currCell - 1);//刷新数据
}
if (currCell + 1 < pageCount && (currCell + 1) >= 0) {
currPage.next.data.init (dataList [currCell + 1], currCell + 1);//刷新数据
} else {
currPage.next.data.init (null, currCell + 1);//刷新数据
}
if(dataList.Length > currCell && currCell >= 0) {
currPage.data.refreshCurrent (currCell, dataList [currCell]);//刷新数据(放在最后)
doCallback (dataList [currCell]);
} else {
currPage.data.refreshCurrent (currCell, null);//刷新数据(放在最后)
doCallback (null);
}
}
void onFinishMoveto (params object[] paras)
{
canDrag = true;
}
void doCallback (object data)
{
Utl.doCallback (onRefreshCurrentPage, currCell, data, currPage.data);
}
public void moveTo (bool force = false)
{
canDrag = false;
Callback cb = onFinishMoveto;
moveToCell.moveTo (currCell, isReverse, false, cb);
if (oldCurrCell != currCell || force) {
int diff = currCell - oldCurrCell;
int absDiff = Mathf.Abs (diff);
int _flag = diff / absDiff;
for (int i = 0; i < absDiff; i++) {
resetCell (force);
oldCurrCell += _flag;
}
oldCurrCell = currCell;
//刷新数据==================
int pageCount = dataList.Length;
if (currCell - 1 >= 0 && currCell - 1 < pageCount) {
currPage.prev.data.init (dataList [currCell - 1], currCell - 1);//刷新数据
} else {
currPage.prev.data.init (null, currCell - 1);//刷新数据
}
if (currCell + 1 < pageCount && (currCell+1) >= 0) {
currPage.next.data.init (dataList [currCell + 1], currCell + 1);//刷新数据
} else {
currPage.next.data.init (null, currCell + 1);//刷新数据
}
if(dataList.Length > currCell && currCell >= 0) {
currPage.data.refreshCurrent (currCell, dataList [currCell]);//刷新数据(放在最后)
doCallback (dataList [currCell]);
} else {
currPage.data.refreshCurrent (currCell, null);//刷新数据(放在最后)
doCallback (null);
}
}
}
void resetCell (bool isForce)
{
if (currCell > 0) {
NGUITools.SetActive (currPage.prev.data.gameObject, true);
}
//处理边界
int pageCount = dataList.Length;
//移动位置
UIDragPageContents cell;
Vector3 toPos = Vector3.zero;
if (oldCurrCell < currCell) {
cell = currPage.prev.data;
if (arrangement == UIGrid.Arrangement.Horizontal) {
toPos = currPage.data.transform.localPosition;
toPos.x += flag * cellWidth * 2;
} else {
toPos = currPage.data.transform.localPosition;
toPos.y -= flag * cellHeight * 2;
}
} else {
cell = currPage.next.data;
if (arrangement == UIGrid.Arrangement.Horizontal) {
toPos = currPage.data.transform.localPosition;
toPos.x -= flag * cellWidth * 2;
} else {
toPos = currPage.data.transform.localPosition;
toPos.y += flag * cellHeight * 2;
}
}
cell.transform.localPosition = toPos;
if (isLimitless || (!isLimitless && (oldCurrCell != -1 || currCell != 0))) {
if (oldCurrCell < currCell) {
currPage = currPage.next;
} else {
currPage = currPage.prev;
}
}
}
public void onPress (bool isPressed)
{
//===============
if (!isPressed) {
if (canDrag) {
procMoveCell ();
}
} else {
totalDelta = Vector2.zero;
}
}
Vector2 totalDelta = Vector2.zero;
public void onDrag (Vector2 delta)
{
totalDelta += delta;
}
//处理移动单元
public void procMoveCell ()
{
int index = currCell;
if (dataList == null || dataList.Length <= 0) {
return;
}
float delta = 0;
float sensitivity = dragSensitivity <= 0 ? 1 : dragSensitivity;
if (arrangement == Arrangement.Horizontal) {
delta = totalDelta.x;
if (Mathf.Abs (delta) >= cellWidth / dragSensitivity) {
if (flag * delta > 0) {
index--;
} else {
index++;
}
}
} else {
delta = totalDelta.y;
if (Mathf.Abs (delta) >= cellHeight / dragSensitivity) {
if (flag * delta > 0) {
index++;
} else {
index--;
}
}
}
if (scrollView.dragEffect == UIScrollView.DragEffect.Momentum) {
if ((index < 0 || index >= dataList.Length) && !isLimitless) {
return;
}
}
moveTo (index);
}
public void moveTo (int index)
{
currCell = index;
if(!isLimitless) {
currCell = currCell < 0 ? 0 : currCell;
currCell = currCell >= dataList.Length ? dataList.Length - 1 : currCell;
}
moveTo ();
}
}
}