将NGUI 自带Demo Example14的Vertical2抽出来,UICenterOnChild.cs自带的这个类里nextPageThreshold(滑动灵敏参数)无效
整个类替换之后即可实现效果。
//----------------------------------------------
// NGUI: Next-Gen UI kit
// Copyright © 2011-2014 Tasharen Entertainment
//----------------------------------------------
using UnityEngine;
/// <summary>
/// Ever wanted to be able to auto-center on an object within a draggable panel?
/// Attach this script to the container that has the objects to center on as its children.
/// </summary>
[AddComponentMenu("NGUI/Interaction/Center Scroll View on Child")]
public class UICenterOnChild : MonoBehaviour
{
/// <summary>
/// The strength of the spring.
/// </summary>
public float springStrength = 8f;
/// <summary>
/// If set to something above zero, it will be possible to move to the next page after dragging past the specified threshold.
/// </summary>
public float nextPageThreshold = 0f;
/// <summary>
/// Callback to be triggered when the centering operation completes.
/// </summary>
public SpringPanel.OnFinished onFinished;
UIScrollView mScrollView;
GameObject mCenteredObject;
/// <summary>
/// Game object that the draggable panel is currently centered on.
/// </summary>
public GameObject centeredObject { get { return mCenteredObject; } }
void OnEnable() { Recenter(); }
void OnDragFinished() { if (enabled) Recenter(); }
/// <summary>
/// Ensure that the threshold is always positive.
/// </summary>
void OnValidate()
{
nextPageThreshold = Mathf.Abs(nextPageThreshold);
}
/// <summary>
/// Recenter the draggable list on the center-most child.
/// </summary>
public void Recenter()
{
if (mScrollView == null)
{
mScrollView = NGUITools.FindInParents<UIScrollView>(gameObject);
if (mScrollView == null)
{
Debug.LogWarning(GetType() + " requires " + typeof(UIScrollView) + " on a parent object in order to work", this);
enabled = false;
return;
}
else
{
mScrollView.onDragFinished = OnDragFinished;
if (mScrollView.horizontalScrollBar != null)
mScrollView.horizontalScrollBar.onDragFinished = OnDragFinished;
if (mScrollView.verticalScrollBar != null)
mScrollView.verticalScrollBar.onDragFinished = OnDragFinished;
}
}
if (mScrollView.panel == null) return;
// Calculate the panel's center in world coordinates
Vector3[] corners = mScrollView.panel.worldCorners;
Vector3 panelCenter = (corners[2] + corners[0]) * 0.5f;
// Offset this value by the momentum
Vector3 pickingPoint = panelCenter - mScrollView.currentMomentum * (mScrollView.momentumAmount * 0.1f);
mScrollView.currentMomentum = Vector3.zero;
float min = float.MaxValue;
Transform closest = null;
Transform trans = transform;
int index = 0;
// Determine the closest child
for (int i = 0, imax = trans.childCount; i < imax; ++i)
{
Transform t = trans.GetChild(i);
float sqrDist = Vector3.SqrMagnitude(t.position - pickingPoint);
if (sqrDist < min)
{
min = sqrDist;
closest = t;
index = i;
}
}
// If we have a touch in progress and the next page threshold set
if (nextPageThreshold > 0f && UICamera.currentTouch != null)
{
// If we're still on the same object
if (mCenteredObject != null && mCenteredObject.transform == trans.GetChild(index))
{
Vector2 delta = UICamera.currentTouch.totalDelta;
Debug.Log("delta="+ delta+ " nextPageThreshold="+ nextPageThreshold+" index= "+index);
if (delta.x > nextPageThreshold)
{
// Next page
if (index > 0)
closest = trans.GetChild(index - 1);
else
{
closest= trans.GetChild(trans.childCount - 1);
}
}
else if (delta.x < -nextPageThreshold)
{
// Previous page
if (index < trans.childCount - 1)
closest = trans.GetChild(index + 1);
else
closest = trans.GetChild(0);
}
}
}
CenterOn(closest, panelCenter);
}
/// <summary>
/// Center the panel on the specified target.
/// </summary>
void CenterOn(Transform target, Vector3 panelCenter)
{
if (target != null && mScrollView != null && mScrollView.panel != null)
{
Transform panelTrans = mScrollView.panel.cachedTransform;
mCenteredObject = target.gameObject;
// Figure out the difference between the chosen child and the panel's center in local coordinates
Vector3 cp = panelTrans.InverseTransformPoint(target.position);
Vector3 cc = panelTrans.InverseTransformPoint(panelCenter);
Vector3 localOffset = cp - cc;
// Offset shouldn't occur if blocked
if (!mScrollView.canMoveHorizontally) localOffset.x = 0f;
if (!mScrollView.canMoveVertically) localOffset.y = 0f;
localOffset.z = 0f;
// Spring the panel to this calculated position
SpringPanel.Begin(mScrollView.panel.cachedGameObject,
panelTrans.localPosition - localOffset, springStrength).onFinished = onFinished;
}
else mCenteredObject = null;
}
/// <summary>
/// Center the panel on the specified target.
/// </summary>
public void CenterOn(Transform target)
{
if (mScrollView != null && mScrollView.panel != null)
{
Vector3[] corners = mScrollView.panel.worldCorners;
Vector3 panelCenter = (corners[2] + corners[0]) * 0.5f;
CenterOn(target, panelCenter);
}
}
}