同步操作将从 Foldcc/FScrollPage 强制同步,此操作会覆盖自 Fork 仓库以来所做的任何修改,且无法恢复!!!
确定后同步将在后台操作,完成时将刷新页面,请耐心等待。
一个用于Unity5.x及以上的滑动展示控件。
由于Unity自带的Scroll View控件不能灵活的满足自己实际开发,因此想到自己制作一个滑动展示页面,且该控件不依赖Unity的其他UI控件,但该控件存在局限性,仅供参考
实际效果预览:
该控件滑动周期由三个部分组成 :
滑动展示栏由一个控制器和多个滑块组成,使用时需要设置控制器的参数配置,内部的滑动item需要有FScrollItem组件或者继承自FScrollItem的组件,其中FScrollItem开放了点击和被选中事件,可以在两个接口中写自定义逻辑。
滑动控制器FScrollPage 负责整理FScrollitem的位置和大小,用户触摸交互,监听滑动事件,执行滑动特效以及传递选中事件给子物体FScrollitem。 考虑到易用性,在FScrollPage的初始化分为两种,第一种是自动检查指定节点下的子对象进行标记id和排序整理m默认选中第一个被标记的item,第二种方式是传递一个map<itemID , item> 以及默认选中id。
滑动对象FScrollItem 提供了点击、被选中回调事件,当被点击时自动将该Item滑动到中心并向FScrollPage通知并选中到该Item。
将获取到的子对象map<itemID,item>进行遍历,生成对应的FScroillObject对象并设置统一的布局方式(居中),初始化lastPostion和Postion (FScrollObject除了有RectTransfrom属性外还有一个Postion属性和lastPostion属性,分别用来纪录当前(或正在前往)的位置和上一次位置信息)。用于后续的滑动和位置校正。
滑动监听原理时通过检测有触摸或按下事件到滑动条上时激活滑动检测,当移动速度大于阈值时则判定当前正在滑动中,当检测到手指或鼠标离开滑动条时结束滑动监听。 这里有一点需要注意,如果触摸滑动条触摸到了item这会被拦截点击事件,滑动条的OnPointerDown事件不会被触发,解决办法我开始参考的是一篇渗透UI点击事件文章 : 渗透UI点击事件 ,但是使用后发现多个UI重叠时会出现栈内存溢出,导致编辑器卡死,后来想了一个更简单的办法,在FScrollItem中同样实现点击事件接口,当被按下或抬起时直接将事件继续传递给控制器的对应事件。
public void OnPointerDown(PointerEventData eventData)
{
//传递事件
scrollPage.OnPointerDown(eventData);
//后续逻辑
lastPointer = eventData.position;
}
滑动时根据滑动速度来控制item的移动,滑动结束后使用速度线性递减,当速度低于一定阈值时执行位置校正,其中弹动的效果使用的时一个缓动函数BackEaseOut。
static float BackEaseOut(float t, float b = 0, float c = 1, float d = 1)
{
return c * ((t = t / d - 1) * t * ((1.70158f + 1) * t + 1.70158f) + 1) + b;
}
位置校正时先查询距离中心点最近的item,记录并传递该item的ID到滑动方法中,然后通过滑动方法使Item移动到正常位置。
如果你需要使用源码你需要了解以下的缺陷,你可以对缺陷进行修改或者修复
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。