Unity判断Scroll View是否停止滑动
1、思路:
ScrollRect有一个velocity的值,我们启用一个协程,每隔指定时间检测它的值,当它的值小于我们设置的阈值时,就可以认为它是停下来了,但是这时速度一直都是小于阈值的,他会一直执行在停止之后的逻辑,而我们希望实现当它停止下来之后,只执行一遍我们需要执行的方法,就不执行了,所以我们实现IEndDragHandler接口,当拖拽结束之后,将carryOut的值设置为为true,表示可以继续执行方法,当执行方法之后,再设置为false,表示不可以执行方法
2、实现代码
public class ScrollViewManager : Singleton<ScrollViewManager>,IEndDragHandler
{
ScrollRect scrollRect;
public float stopThreshold = 50f; // 判断停止的阈值
public float checkInterval = 0.2f; // 检测间隔时间
private bool isStop;
private bool carryOut;
protected override void Awake()
{
base.Awake();
scrollRect = GetComponent<ScrollRect>();
carryOut = false;
}
void Start()
{
StartCoroutine(CheckScrollStopped());
}
IEnumerator CheckScrollStopped()
{
while (true)
{
yield return new WaitForSeconds(checkInterval);
IsScrollStopped();
if (isStop && carryOut)
{
//在这里执行停止之后需要执行的事件
EventCenter.CallOnStopEvent();
//执行一次之后,不再继续执行
carryOut = false;
}
}
}
void IsScrollStopped()
{
// 获取当前的速度
Vector2 velocity = scrollRect.velocity;
// 检查速度是否小于阈值
isStop = velocity.magnitude < stopThreshold;
}
public void OnEndDrag(PointerEventData eventData)
{
//拖拽结束之后,可以开始检测
carryOut = true;
}
}