UGUI ScrollRect滑动定位优化详解

作者:Stephanie_1 时间:2021-12-06 09:56:13 

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<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优化链接

来源:https://blog.csdn.net/Stephanie_1/article/details/51940616

标签:UGUI,ScrollRect,滑动
0
投稿

猜你喜欢

  • Android控件PopupWindow模仿ios底部弹窗

    2023-03-09 20:42:10
  • Java连接Linux服务器过程分析(附代码)

    2023-05-28 19:57:09
  • Java哈希表和有序表实例代码讲解

    2023-05-28 11:29:29
  • Android实现Z轴布局效果

    2021-11-19 05:33:56
  • Android 使用FragmentTabhost代替Tabhost

    2021-09-10 19:10:26
  • 带你入门Java的泛型

    2023-06-08 02:48:24
  • java 获取当前时间的三种方法

    2022-10-11 21:54:04
  • spring的@Transactional注解用法解读

    2021-10-08 23:48:43
  • c语言轻松实现猜数字小游戏

    2021-10-21 23:42:13
  • TabLayout标题文字不显示的解决操作

    2023-02-19 18:34:48
  • AndroidStudio简单实现BMI计算

    2022-11-24 03:14:50
  • 关于Intellij IDEA中的Version Control问题

    2021-12-27 08:42:01
  • 浅谈maven的jar包和war包区别 以及打包方法

    2022-07-20 20:14:44
  • 带你了解Java中Static关键字的用法

    2021-11-07 15:04:32
  • JavaWeb 网上书店 注册和登陆功能案例详解

    2022-09-20 02:53:22
  • java 在Jetty9中使用HttpSessionListener和Filter

    2021-10-01 14:44:00
  • Spring中实现定时调度的几种方法

    2021-08-29 13:04:44
  • 从最基本的Java工程搭建SpringMVC+SpringDataJPA+Hibernate

    2023-05-31 20:37:20
  • SpringBoot配置全局异常处理器捕获异常详解

    2023-11-28 05:08:07
  • Java 静态绑定与动态绑定深入分析

    2021-06-19 05:31:04
  • asp之家 软件编程 m.aspxhome.com