UGUI ScrollRect滑动定位优化详解

 更新时间:2020年04月17日 14:51:32   作者:Stephanie_1  
这篇文章主要为大家详细介绍了UGUI ScrollRect滑动定位优化,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

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

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

但是我们既然要用这个组件就是希望它在实现功能的时候体验良好,排除特殊需求,我们当然不希望它一直滚动下去,该停的时候就停,但是如果你检查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<GameObject > stopScrollCallback = null;//滑动结束的回调

 private float _scrolledTime = 0f;
 private Action<GameObject> _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;
 } 
}

下载地址:ScrollRect优化链接

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • 详解C#扩展方法原理及其使用

    详解C#扩展方法原理及其使用

    这篇文章主要介绍了C#扩展方法原理及其使用的的相关资料,文中代码非常细致,帮助大家更好的理解和学习,感兴趣的朋友可以了解下
    2020-06-06
  • C#常用的字符串扩展方法汇总

    C#常用的字符串扩展方法汇总

    这篇文章主要介绍了C#常用的字符串扩展方法汇总,包括了常见的字符串操作与数据类型转换等,非常具有实用价值,需要的朋友可以参考下
    2014-10-10
  • C#实现异步GET的方法

    C#实现异步GET的方法

    这篇文章主要介绍了C#实现异步GET的方法,涉及C#异步请求的相关实现技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-07-07
  • C# IsDefined的问题

    C# IsDefined的问题

    这篇文章主要介绍了C# IsDefined的问题,通俗易懂,需要的朋友可以参考下。
    2016-06-06
  • 基于C#实现简易的键盘记录器

    基于C#实现简易的键盘记录器

    本文将利用C#语言和HOOK技术来做一个键盘记录器,看看一天下来,我们点击了多少次键盘,哪些键的使用频率最高,感兴趣的小伙伴可以尝试一下
    2022-08-08
  • C#客户端HttpClient请求认证及数据传输

    C#客户端HttpClient请求认证及数据传输

    本文详细讲解了C#客户端HttpClient请求认证及数据传输,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-01-01
  • C#使用Interlocked实现线程同步

    C#使用Interlocked实现线程同步

    今天小编就为大家分享一篇关于C#使用Interlocked实现线程同步,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-10-10
  • C#简单读取、改变文件的创建、修改及访问时间的方法

    C#简单读取、改变文件的创建、修改及访问时间的方法

    这篇文章主要介绍了C#简单读取、改变文件的创建、修改及访问时间的方法,涉及C#文件类SetCreationTime、SetLastWriteTime及SetLastAccessTime的相关使用技巧,需要的朋友可以参考下
    2015-07-07
  • 浅谈Async和Await如何简化异步编程(几个实例让你彻底明白)

    浅谈Async和Await如何简化异步编程(几个实例让你彻底明白)

    本篇文章主要介绍了浅谈Async和Await如何简化异步编程,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-12-12
  • 在WPF中动态加载XAML中的控件实例代码

    在WPF中动态加载XAML中的控件实例代码

    这篇文章主要介绍了在WPF中动态加载XAML中的控件,实例分析了WPF中针对XAML中控件的动态调用技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2016-07-07

最新评论