首先提供下NGUI工具接口
///
/// 创建Panel
///
/// 父对象
/// 名称
/// 坐标
/// Panel游戏对象
public static GameObject createPanel(GameObject parent, string panelName, Vector3 pos)
{
if (parent == null) return null;
int depth = UIPanel.nextUnusedDepth;
UIPanel panel = NGUITools.AddChild(parent);
panel.depth = depth;
panel.gameObject.name = panelName;
panel.transform.localPosition = pos;
panel.gameObject.layer = parent.layer;
return panel.gameObject;
}
///
/// 创建可拖拽的裁剪区
///
/// 要被裁剪的Panel
/// 裁剪区区域和大小
/// 拖拉方向
/// 锚点
/// 裁剪力度
/// UIScrollView对象
public static UIScrollView createClipAndDrag(GameObject dragPanel, Vector4 DragCenterAndRange, UIScrollView.Movement moveDiract,
UIWidget.Pivot piovt, Vector2 clipSoftness)
{
UIPanel panel = dragPanel.GetComponent();
panel.clipping = UIDrawCall.Clipping.SoftClip; //裁剪方式//
panel.baseClipRegion = DragCenterAndRange; //裁剪区区域和大小//
panel.clipSoftness = clipSoftness; //裁剪力度//
UIScrollView scrollPanel = dragPanel.AddComponent();
scrollPanel.movement = moveDiract; //拖拉方向//
scrollPanel.contentPivot = piovt; //锚点//
scrollPanel.disableDragIfFits = true;
return scrollPanel;
}
public OnDragNotification onDrag;
///
/// Drag the object along the plane.
///
public void Drag ()
{
if (UICamera.currentScheme == UICamera.ControlScheme.Controller) return;
if (enabled && NGUITools.GetActive(gameObject) && mShouldMove)
{
if (mDragID == -10) mDragID = UICamera.currentTouchID;
UICamera.currentTouch.clickNotification = UICamera.ClickNotification.BasedOnDelta;
// Prevents the drag "jump". Contributed by 'mixd' from the Tasharen forums.
if (smoothDragStart && !mDragStarted)
{
mDragStarted = true;
mDragStartOffset = UICamera.currentTouch.totalDelta;
if (onDragStarted != null) onDragStarted();
}
Ray ray = smoothDragStart ?
UICamera.currentCamera.ScreenPointToRay(UICamera.currentTouch.pos - mDragStartOffset) :
UICamera.currentCamera.ScreenPointToRay(UICamera.currentTouch.pos);
float dist = 0f;
if (mPlane.Raycast(ray, out dist))
{
Vector3 currentPos = ray.GetPoint(dist);
Vector3 offset = currentPos - mLastPos;
mLastPos = currentPos;
if (offset.x != 0f || offset.y != 0f || offset.z != 0f)
{
offset = mTrans.InverseTransformDirection(offset);
if (movement == Movement.Horizontal)
{
offset.y = 0f;
offset.z = 0f;
}
else if (movement == Movement.Vertical)
{
offset.x = 0f;
offset.z = 0f;
}
else if (movement == Movement.Unrestricted)
{
offset.z = 0f;
}
else
{
offset.Scale((Vector3)customMovement);
}
offset = mTrans.TransformDirection(offset);
}
// Adjust the momentum
if (dragEffect == DragEffect.None) mMomentum = Vector3.zero;
else mMomentum = Vector3.Lerp(mMomentum, mMomentum + offset * (0.01f * momentumAmount), 0.67f);
// Move the scroll view
if (!iOSDragEmulation || dragEffect != DragEffect.MomentumAndSpring)
{
MoveAbsolute(offset);
}
else
{
Vector3 constraint = mPanel.CalculateConstrainOffset(bounds.min, bounds.max);
if (constraint.magnitude > 1f)
{
MoveAbsolute(offset * 0.5f);
mMomentum *= 0.5f;
}
else
{
MoveAbsolute(offset);
}
}
// We want to constrain the UI to be within bounds
if (restrictWithinPanel &&
mPanel.clipping != UIDrawCall.Clipping.None &&
dragEffect != DragEffect.MomentumAndSpring)
{
RestrictWithinBounds(true, canMoveHorizontally, canMoveVertically);
}
if (null != onDrag)
onDrag();
}
}
}
private GameObject m_dragPanel;
private UIScrollView m_scrollView;
///
/// 创建列表
///
private void createDragList()
{
m_dragPanel = NGUIComponentFactory.createPanel(m_gamePanel, "dragPanel", Vector3.zero);
m_scrollView = NGUIComponentFactory.createClipAndDrag(m_dragPanel, new Vector4(0, 29.5f, 500, 360),
UIScrollView.Movement.Vertical, UIWidget.Pivot.Top, Vector2.one);
m_scrollView.onDragFinished = onPanelDragFinished;
m_scrollView.onDrag = onPanelOnDrag;
//创建列表项//
}
private UILabel m_loadMoreTips;
private int m_curDisplayNum;
private void onPanelDragFinished()
{
if (null != m_loadMoreTips)
{
//创建更多项目//
}
}
private void onPanelOnDrag()
{
if (null == m_dragPanel || null == m_scrollView) return;
Vector3 constraint = m_dragPanel.GetComponent().CalculateConstrainOffset(m_scrollView.bounds.min, m_scrollView.bounds.max);
if (null == m_loadMoreTips && constraint.y < 0)
{
m_loadMoreTips = NGUIComponentFactory.createLabel(m_dragPanel, "tipsLoadMore", ResourceManager.instance.myFont,
new Vector3(0, 250f - 102f * m_curDisplayNum - 85f, 0), 30);
m_loadMoreTips.overflowMethod = UILabel.Overflow.ResizeFreely;
m_loadMoreTips.text = "加载更多";
}
}
创建Label的接口如下
///
/// 创建Label
///
/// 父对象
/// 名称
/// 字体
/// 坐标
/// 大小
/// UILabel对象
public static UILabel createLabel(GameObject parent, string labelName, UIFont font, Vector3 pos, int fontSize)
{
UILabel lbl = NGUITools.AddWidget(parent);
lbl.gameObject.name = labelName;
lbl.bitmapFont = font;
lbl.fontSize = fontSize;
Transform transform = lbl.gameObject.transform;
transform.localPosition = pos;
return lbl;
}