UGUI ScrollRect滑动定位优化详解
作者:Stephanie_1 时间:2021-12-06 09:56:13
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优化链接
来源:https://blog.csdn.net/Stephanie_1/article/details/51940616
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
JDK8时间相关类超详细总结(含多个实例)
java异常处理的简单练习
Java使用Redis实现秒杀功能
![](https://img.aspxhome.com/file/2023/1/78001_0s.jpg)
使用Java读取Word文件的简单例子分享
![](https://img.aspxhome.com/file/2023/8/87358_0s.png)
C#开发Windows UWP系列之布局面板RelativePanel
![](https://img.aspxhome.com/file/2023/4/81134_0s.png)
Java如何定义Long类型
![](https://img.aspxhome.com/file/2023/6/62246_0s.png)
浅谈SpringBoot在使用测试的时候是否需要@RunWith
![](https://img.aspxhome.com/file/2023/1/64061_0s.jpg)
springboot FeignClient注解及参数
详解MyBatis配置typeAliases的方法
相对路径和绝对路径的写法总结
Java Kryo,Protostuff,Hessian序列化方式对比
![](https://img.aspxhome.com/file/2023/0/68500_0s.png)
全局记录Feign的请求和响应日志方式
通过JDK源码学习InputStream详解
Java swing 图像处理多种效果实现教程
![](https://img.aspxhome.com/file/2023/0/77960_0s.jpg)
项目为什么引入log4j而不是logback代码
![](https://img.aspxhome.com/file/2023/1/67971_0s.png)
Android如何在Gradle中更改APK文件名详解
Java使用自定义注解实现为事件源绑定事件监听器操作示例
![](https://img.aspxhome.com/file/2023/8/83148_0s.png)
详细了解JAVA NIO之Buffer(缓冲区)
![](https://img.aspxhome.com/file/2023/2/67482_0s.jpg)
RxJava+Retrofit+Mvp实现购物车
![](https://img.aspxhome.com/file/2023/7/64957_0s.gif)