Unity ScrollView手机滑动手感的问题

一直以来总是感觉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"));
        
    }
}

手机调试,反应灵敏多了,还有滑动感,还不错,这就分享上来。

这里建议一定要在手机上测试,因为电脑上和手机上手感是完全不一样的。

经过一段时间测试,发现有时手快速划过然后松开,因为上面的代码加速度是在松开和上一帧的点计算的,可能突然停下来松开速度快过。

可以改成尝试取几次来平均计算可能效果更好。
后面有机会再补充下代码。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值