UGUI ScrollRect滑动定位优化详解
- 作者: 不狠不能日刺猬
- 来源: 51数据库
- 2021-07-28
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#通过fleck实现wss协议的WebSocket多人Web实时聊天(附源码)
- 团队城市未满足要求:MSBuildTools12.0_x86_Path 存在
- 使用 MSBuild.exe 在发布模式下构建 C# 解决方案
- 当我发布 Web 应用程序时,AfterPublish 脚本不运行
- 构建时 T4 转换的产品仅在下一个构建中使用
- ASP.NET Core Application (.NET Framework) for Windows x64 only error in project.assets.json
- 新的 .csproj 格式 - 如何将整个目录指定为“链接文件"到子目录?
- 如何将条件编译符号(DefineConstants)传递给 msbuild
- MSBuild 支持 Visual Studio 2017 RTM 中的 T4 模板
- NuGet 包还原找不到包,没有源
热点文章
团队城市未满足要求:MSBuildTools12.0_x86_Path 存在
0
使用 MSBuild.exe 在发布模式下构建 C# 解决方案
0
当我发布 Web 应用程序时,AfterPublish 脚本不运行
0
构建时 T4 转换的产品仅在下一个构建中使用
0
ASP.NET Core Application (.NET Framework) for Windows x64 only error in project.assets.json
0
新的 .csproj 格式 - 如何将整个目录指定为“链接文件"到子目录?
0
如何将条件编译符号(DefineConstants)传递给 msbuild
0
MSBuild 支持 Visual Studio 2017 RTM 中的 T4 模板
0
NuGet 包还原找不到包,没有源
0
使用 C# 6.0 功能运行 TFS 构建
0
