如何实现UGUIScrollRect滑动定位优化-创新互联

这篇文章主要讲解了如何实现UGUI ScrollRect滑动定位优化,内容清晰明了,对此有兴趣的小伙伴可以学习一下,相信大家阅读完之后会有帮助。

创新互联服务项目包括农安网站建设、农安网站制作、农安网页制作以及农安网络营销策划等。多年来,我们专注于互联网行业,利用自身积累的技术优势、行业经验、深度合作伙伴关系等,向广大中小型企业、政府机构等提供互联网行业的解决方案,农安网站推广取得了明显的社会效益与经济效益。目前,我们服务的客户以成都为中心已经辐射到农安省份的部分城市,未来相信会继续扩大服务区域并继续获得客户的支持与信任!

UGUI的滑动组件虽然表现上和NGUI的ScrollView一致,但是它更美好的是开放源码的,不了解原理的时候直接查源码就OK。

在使用ScrollRect的时候,想滑动流畅然后定位,既待惯性的滚动设置,如图MovementType指定为Elastic则为带惯性的滑动模式,同时调整Inertia为惯性系数,值越大则惯性表现越大,即滑动手离开后自由滑动到停止所需的时间也越长。Inertia=0时则表示不带惯性,滑动时手离开 滑动即停止。

如何实现UGUI ScrollRect滑动定位优化

但是我们既然要用这个组件就是希望它在实现功能的时候体验良好,排除特殊需求,我们当然不希望它一直滚动下去,该停的时候就停,但是如果你检查ScrollRect的源码或直接将滑动中的滚动区坐标变化情况打印出来会发现这个坐标刷新耗时太久了,带惯性的滚动滑动一下就要刷新2甚至更长,坐标变化才会完全结束,如果真等他自然结束我们再做一些如“定位”的操作,真的耗时太长了。因此我想优化一下带惯性的滑动,比如显示它不要自由滑动那么久,加入一个限制时间,比如手离开多长时间就停止滑动。
ScrollRectMe组件在ScrollRect的基础上又增加了两个属性,inertiaMaxTime大自由滑动的时间和滑动完全结束的事件stopScrollCallback,因为带惯性滚动时OnDrag事件并不能满足需求,那仅仅是手离开就会响应的事件。

2017-6-27更新补充了一下滑动幅度不大的时候或惯性时间都不足设定值inertiaMaxTime 不回调的问题。

最后附上源码:

using UnityEngine;
using UnityEngine.UI;
using UnityEngine.EventSystems;
using System;

public class ScrollRectMe : ScrollRect
{
 [SerializeField]
 public float inertiaMaxTime = 0.5f;//限制惯性持续时间

 public Action stopScrollCallback = null;//滑动结束的回调

 private float _scrolledTime = 0f;
 private Action _stopScrollCallback = null;

 private Vector2 _lastPostion = Vector2.zero;

 public override void OnEndDrag(PointerEventData eventData)
 {
 base.OnEndDrag(eventData);
 _stopScrollCallback = stopScrollCallback;
 _scrolledTime = 0f;
 _lastPostion = Vector2.zero;
 }

 public override void OnDrag(PointerEventData eventData)
 {
 base.OnDrag(eventData);
 _scrolledTime = 0f;
 _lastPostion = Vector2.zero;
 }

 public override void StopMovement()
 {
 base.StopMovement(); 
 }

 protected override void LateUpdate()
 {
 // base.LateUpdate();
 }

 private void Update()
 {
 base.LateUpdate();
 }

 protected override void SetContentAnchoredPosition(Vector2 position)
 {
 //2017-6-27 修改补充条件
 if (_scrolledTime >= inertiaMaxTime || (position.ToString("0.0") == _lastPostion.ToString("0.0")))
 {
 if (_stopScrollCallback != null)
 {
 _stopScrollCallback(transform.gameObject);
 _stopScrollCallback = null;
 }
 _scrolledTime = inertiaMaxTime;
 return;
 }

 base.SetContentAnchoredPosition(position);

 _scrolledTime += Time.unscaledDeltaTime;
 _lastPostion = position;
 } 
}

另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。


名称栏目:如何实现UGUIScrollRect滑动定位优化-创新互联
文章分享:http://myzitong.com/article/ceidpj.html