UGUI——解决UGUI中ScrollView下嵌套Button时Button难以响应的问题

起因

有个常见的需求是:有一个滑动列表,其中每一个单元都是可交互的按钮。按住按钮并拖动可以滑动列表;点击按钮可以触发按钮的点击事件。

在电脑(低dpi、大尺寸的设备)上,看不出问题;但是换到手机(高dpi、小尺寸的设备)上时,可能会出现单元按钮的点击事件很难被响应。

原因

原因在于UGUI的拖拽灵敏度的设置上。这个灵敏度通过EventSystem组件的Drag Threshold参数来指定。

这里写图片描述

这个值被默认设置为5,代表的意义是,当拖拽超过5像素时,会被认为可以触发拖拽事件。

当dpi较低时,拖动一个微小的距离,可能只有3个像素的大小,所以不会被认为发生了拖拽动作;但是dpi较高时,拖动相同的距离,可能距离就已经超过了5个像素,所以会被认为发生了拖拽动作。

在电脑上,交互方式一般是使用鼠标点击,点击的时间相对较短。点击过程中,光标移动的位置一般不会超过5个像素,因此不会触发拖拽事件,而是触发单元按钮的点击事件。

在手机上,交互方式一般是使用手指点击,点击的时间相对较长。如果在点击过程中稍微伴随着手抖,对于高dpi的手机,这一次手抖可能会造成了5个像素以上的移动,就会触发拖拽事件。此时的输入会被滑动列表截获,所以不会触发单元按钮的点击事件。

解决方案

解决方案是根据目标平台去设置Drag Threshold的值,该值的大小应该与目标平台的dpi成反比。

通过在程序开始时添加如下代码可以解决此问题。其中的40.0f为参考值,可以根据需求来调整此数值。

int threshold=(int)Mathf.Ceil (UnityEngine.Screen.dpi / 40.0f);
UnityEngine.EventSystems.EventSystem.current.pixelDragThreshold = threshold;

猜你喜欢

转载自blog.csdn.net/serenahaven/article/details/80845994