unity中对于scrollview下拉加载的方法
发布日期:2021-06-30 19:38:16 浏览次数:3 分类:技术文章

本文共 5789 字,大约阅读时间需要 19 分钟。

首先提供下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; }

然后改造一下NGUI的UIScrollView.cs脚本,添加onDrag托管,并添加到Drag()中调用

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; }

好了,其他逻辑请自己脑补吧

转载地址:https://linxinfa.blog.csdn.net/article/details/49486793 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:Unity使用RenderTexture进行截屏(海报截图分享、适配各种尺寸比例的屏幕)
下一篇:unity中的坐标转换

发表评论

最新留言

逛到本站,mark一下
[***.202.152.39]2024年05月02日 08时19分06秒