一直以来总是感觉Unity做的滚动列表在手机上滑动起来和原生的手感感觉不同,要么感觉不灵敏,要么感觉拖不动。
是否你也有同感?
今天抽时间找下问题,看看有没参数来调整的能好一些。
ScrollView本身有几个参数可以调整,但是都不是那个感觉。
特别是手指快速略过的时候,甚至滚动条可能根本连反应都没有。
感觉他有一个阈值,但是没找到什么参数能来控制,后来找到在EventSystem里有一个DragThreshold,但是设置成1了也没见到作用。
在OnDrag 和 OnEndDrag里加了Log,快速划过后滚动条没动,不是屏幕不灵敏,Log其实已经检测到都有输出了,甚至在OnEndDrag里输出了ScrollView的Velocity竟然都是0 。
所以决定自己给他计算手指松开的速度来解决这个问题。
public class DragScrollViewCheck : EventTriggerListener
{
ScrollRect scrollViewMy; //外层的
float lastTime;
Vector3 lastPos;
int lastForward = -1;
void Start()
{
if (scrollView == null)
FindScrollView();
}
void OnEnable()
{
if (scrollView == null)
FindScrollView();
}
void FindScrollView()
{
scrollViewMy = transform.GetComponentInParent<ScrollRect>();
}
public override void OnDrag(UnityEngine.EventSystems.PointerEventData eventData)
{
bool changed = false;
if (eventData.delta.y > 0 && lastForward != 1)
{
changed = true;
lastForward = 1;
Debug.Log(" 方向变了 > 0");
}
else if (eventData.delta.y < 0 && lastForward != 0)
{
changed = true;
lastForward = 0;
Debug.Log(" 方向变了 < 0");
}
if (changed)
{
lastTime = Time.time;
lastPos = eventData.position;
}
}
public override void OnEndDrag(PointerEventData eventData)
{
lastForward = -1;
float t = Time.time - lastTime;
Vector2 sub = eventData.position - (Vector2)lastPos;
//加速度和距离公式 s = v0t + 1/2at^2;
Vector2 vA = (2 * sub) / (t * t);
//加速度瞬时速度公式 Vt = V0 +at;
Vector2 vT = vA * t;
scrollViewMy.velocity = vT;
//Debug.Log("OnEndDrag:" + scrollViewMy.velocity.ToString("F4") + vT.ToString("F4") + ",t:" + t.ToString("F4"));
}
}
手机调试,反应灵敏多了,还有滑动感,还不错,这就分享上来。
这里建议一定要在手机上测试,因为电脑上和手机上手感是完全不一样的。
经过一段时间测试,发现有时手快速划过然后松开,因为上面的代码加速度是在松开和上一帧的点计算的,可能突然停下来松开速度快过。
可以改成尝试取几次来平均计算可能效果更好。
后面有机会再补充下代码。