unity中对于scrollview下拉加载的方法

74 篇文章 29 订阅
1 篇文章 0 订阅

首先提供下NGUI工具接口

/// <summary>
    /// 创建Panel
    /// </summary>
    /// <param name="parent">父对象</param>
    /// <param name="panelName">名称</param>
    /// <param name="pos">坐标</param>
    /// <returns>Panel游戏对象</returns>
    public static GameObject createPanel(GameObject parent, string panelName, Vector3 pos)
    {
        if (parent == null) return null;
        int depth = UIPanel.nextUnusedDepth;
        UIPanel panel = NGUITools.AddChild<UIPanel>(parent);
        panel.depth = depth;
        panel.gameObject.name = panelName;
        panel.transform.localPosition = pos;
        panel.gameObject.layer = parent.layer;
        return panel.gameObject;
    }

 /// <summary>
    /// 创建可拖拽的裁剪区
    /// </summary>
    /// <param name="dragPanel">要被裁剪的Panel</param>
    /// <param name="DragCenterAndRange">裁剪区区域和大小</param>
    /// <param name="moveDiract">拖拉方向</param>
    /// <param name="piovt">锚点</param>
    /// <param name="clipSoftness">裁剪力度</param>
    /// <returns>UIScrollView对象</returns>
    public static UIScrollView createClipAndDrag(GameObject dragPanel, Vector4 DragCenterAndRange, UIScrollView.Movement moveDiract,
        UIWidget.Pivot piovt, Vector2 clipSoftness)
    {
        UIPanel panel = dragPanel.GetComponent<UIPanel>();
        panel.clipping = UIDrawCall.Clipping.SoftClip;      //裁剪方式//
        panel.baseClipRegion = DragCenterAndRange;      //裁剪区区域和大小//
        panel.clipSoftness = clipSoftness;      //裁剪力度//
        UIScrollView scrollPanel = dragPanel.AddComponent<UIScrollView>();
        scrollPanel.movement = moveDiract;  //拖拉方向//
        scrollPanel.contentPivot = piovt;   //锚点//
        scrollPanel.disableDragIfFits = true;
        return scrollPanel;
    }


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

public OnDragNotification onDrag;

/// <summary>
	/// Drag the object along the plane.
	/// </summary>

	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;

    /// <summary>
    /// 创建列表
    /// </summary>
    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<UIPanel>().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的接口如下

/// <summary>
    /// 创建Label
    /// </summary>
    /// <param name="parent">父对象</param>
    /// <param name="labelName">名称</param>
    /// <param name="font">字体</param>
    /// <param name="pos">坐标</param>
    /// <param name="fontSize">大小</param>
    /// <returns>UILabel对象</returns>
    public static UILabel createLabel(GameObject parent, string labelName, UIFont font, Vector3 pos, int fontSize)
    {
        UILabel lbl = NGUITools.AddWidget<UILabel>(parent);
        lbl.gameObject.name = labelName;
        lbl.bitmapFont = font;
        lbl.fontSize = fontSize;
        Transform transform = lbl.gameObject.transform;
        transform.localPosition = pos;
        return lbl;
    }


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

UGUI ScrollViewUnity 的 UI 系统的一种可滚动显示内容的控件,它常用于显示大量数据或者需要滚动浏览的内容。下拉刷新上拉加载更多是在实际使用为了增强用户体验而加入的功能。 下拉刷新是指用户在滚动 ScrollView 时,向下拉动一段距离后,触发刷新操作,以更新显示的内容。要实现下拉刷新功能,我们可以通过在 ScrollView 的上方增加一个控件,例如一个下拉刷新的提示文字或者一个带有动画效果的图标。当用户下拉 ScrollView 时,通过监听用户手势的滑动距离,当滑动距离超过一定阈值时,触发刷新操作。在刷新操作过程,我们可以调用相应的数据加载函数,重新加载数据,并将新加载的数据更新显示在 ScrollView 上拉加载更多是指用户在滚动 ScrollView 时,当滑动到底部后,触发加载更多操作,以继续显示后续的内容。要实现上拉加载更多功能,我们可以通过在 ScrollView 的下方增加一个控件,例如一个上拉加载的提示文字或者一个带有动画效果的图标。当用户滑动到底部时,我们通过监听 ScrollView 的滚动位置或者判断 ScrollView 内容视图是否完全可见,判断是否需要加载更多内容。在加载更多操作,我们可以调用相应的数据加载函数,加载更多的数据,并将新加载的数据追加到 ScrollView 。 通过实现下拉刷新上拉加载更多功能,可以使用户在浏览大量数据或者滚动显示内容时更加方便快捷。这些功能的实现可以增加用户的交互体验,并且带来更好的用户滚动体验。同时,我们在开发还可以根据具体需求,添加一些附加的功能,例如自定义刷新和加载动画、刷新和加载失败处理等,以进一步提升用户体验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

林新发

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值