static internal int checkDelegate(IntPtr l, int p, out SpringPosition.OnFinished ua) { int op = extractFunction(l, p); if (LuaDLL.lua_isnil(l, p)) { ua = null; return(op); } else if (LuaDLL.lua_isuserdata(l, p) == 1) { ua = (SpringPosition.OnFinished)checkObj(l, p); return(op); } LuaDelegate ld; checkType(l, -1, out ld); if (ld.d != null) { ua = (SpringPosition.OnFinished)ld.d; return(op); } LuaDLL.lua_pop(l, 1); l = LuaState.get(l).L; ua = () => { int error = pushTry(l); ld.pcall(0, error); LuaDLL.lua_settop(l, error - 1); }; ld.d = ua; return(op); }
/// <summary> /// 目前只支持横向的滚动条。 /// 只支持减少一个子控件,并且移除的子控件会移动到滚动条最右边或最左边,位于被移除的控件右边的控件会往左移动一个itemsize的距离(包括被移除的控件)。 /// </summary> /// <param name="goItem"></param> /// <param name="newSize"></param> /// <param name="aniTime"></param> /// <param name="aniStrenth"></param> /// <param name="onFinish"></param> public void DisappearOneAndMoveOn(GameObject goItem, int newSize, float aniTime, float aniStrenth, SpringPosition.OnFinished onFinish) { _aniTime = aniTime; totalSize = newSize; _aniSpringStrenth = aniStrenth; _onAniFinish = onFinish; for (int i = 0; i < mChildren.size; ++i) { Transform t = mChildren[i]; if (t.gameObject == goItem) { goItem.SendMessage("OnWrapDisappear", aniTime, SendMessageOptions.DontRequireReceiver); StartCoroutine("MoveOn", goItem); break; } } }
private IEnumerator MoveOn(GameObject goItem) { // 等待消失动画完成 yield return(new WaitForSeconds(_aniTime)); goItem.SendMessage("OnWrapDisappearEnd", SendMessageOptions.DontRequireReceiver); Vector3 disappearPos = goItem.transform.localPosition; // 移到最后或者最前 Vector3 rightPos = GetRightestPos() + new Vector3(itemSize, 0f, 0f); // 可以移动到最右 // 不需要取绝对值,横向滚动条物件的x值肯定大于等于0 // 纵向的才要 if (Mathf.RoundToInt(rightPos.x / itemSize) < totalSize) { goItem.transform.localPosition = rightPos; onUpdateItem(goItem.transform, Mathf.Abs(Mathf.RoundToInt(goItem.transform.localPosition.x / itemSize))); } else { Vector3 leftPos = GetLeftestPos() - new Vector3(itemSize, 0f, 0f); // 可以移动最左 // 这里不能取绝对值。。 否则结果肯定大于等于0了 if (Mathf.RoundToInt(leftPos.x / itemSize) >= 0) { goItem.transform.localPosition = leftPos; onUpdateItem(goItem.transform, Mathf.Abs(Mathf.RoundToInt(goItem.transform.localPosition.x / itemSize))); } else { // 两边都不满足,则移动到最右,并且隐藏 goItem.transform.localPosition = rightPos; NGUITools.SetActive(goItem, false); } } // 如果总大小小于预留控件大小,则需要隐藏刚消失的控件 // if (totalSize < mChildren.size) // { // NGUITools.SetActive(goItem, false); // } // else // { // onUpdateItem(goItem.transform, Mathf.Abs(Mathf.RoundToInt(goItem.transform.localPosition.x / itemSize))); // } bool hasSpring = false; // 超过消失点的控件,spring到合适位置 // to do 如果是不可见的控件,不能用spring,直接设置到目标位置 for (int i = 0; i < mChildren.size; ++i) { Transform t = mChildren[i]; if (t.localPosition.x > disappearPos.x) { if (NGUITools.GetActive(t.gameObject)) { hasSpring = true; if (Mathf.RoundToInt(t.localPosition.x - disappearPos.x) == itemSize) { t.gameObject.SendMessage("OnWrapSpringBegin", SendMessageOptions.DontRequireReceiver); SpringPosition.Begin(t.gameObject, t.localPosition - new Vector3(itemSize, 0f, 0f), _aniSpringStrenth).onFinished = _onAniFinish; } else { SpringPosition.Begin(t.gameObject, t.localPosition - new Vector3(itemSize, 0f, 0f), _aniSpringStrenth); } } else { t.localPosition = t.localPosition - new Vector3(itemSize, 0f, 0f); } } } if (!hasSpring) { if (_onAniFinish != null) { _onAniFinish(); _onAniFinish = null; } } }