Unity学习笔记 触摸屏中ScrollView里的Button无法正常或难以响应的解决方法

news/2025/2/4 1:04:38/

前言

工作中在负责的项目中,某一天某一个滑动列表(列表里包含按钮)的功能在原本机器上离奇的突然无法正常响应。在电脑编辑器用鼠标操作毫无问题,但是到了4K触摸屏上就有问题了,拖拽的功能可以正常实现,就是拖拽内容里的按钮怎么点都没办法响应,除非是对着这个按钮疯狂点击多次,可能会触发一次。
在经过多方面的问题排查后,只能定位出是ScrollView和Button之间存在冲突
绝望之际,好在看到了这篇UGUI——解决UGUI中ScrollView下嵌套Button时Button难以响应的问题,在这里要非常感谢这篇文章所提供的灵感帮助和解决方案!!

原因

造成这样的情况是EventSystem中的Drag Threshold参数设置较低的原因所造成的。
在这里插入图片描述
这里需要解释一下,Drag Threshold到底是什么东西
在这里插入图片描述
官方的解释是“The soft area for dragging in pixels.” 翻译过来就是:触发拖拽行为所需要的像素点。
也就是说,假如我设置的是10,我的pointer(指针)需要移动超过10个像素点才可以触发拖拽的指令。
Unity底层判定代码如下: (来自PointerInputModule.cs)在这里插入图片描述
并且在拖拽行为发生之前,Unity会取消所有PointerPress的选择和状态,所以一旦触发Drag行为,会立马中断OnPointerDown的事件并且立马触发OnPointerUp,同时eligibleForClick变成false意思就是该行为不是一个click行为。
在这里插入图片描述

那DragThreshold设多少为好又由什么决定呢,这里就要引入屏幕dpi的概念了。
DPI是指每英寸的像素,以鼠标为例子解释的话就是鼠标在桌面上移动1英寸的距离的同时,光标能够在屏幕上移动多少“像素点”。
所以对于不同的DPI来说,鼠标/触摸点移动相同的距离,在DPI较低的屏幕上看到的可能只移动了几个像素点,而在高DPI的屏幕上看到移动了十几个像素点。

结合以上论述内容就能推出为什么在电脑上用鼠标调试正常而在4K触摸屏上变得不正常,因为在电脑上用鼠标点击的过程中鼠标几乎保持不动,像素点的移动不会超出设置的DragThreshold。而在触摸屏上,因为是高dpi的触摸屏,而且加上是手指来点击,精准度和时间肯定比不上鼠标点击,很有可能就是点击的时候移动了几个像素点,移动超出了设置的DragThreshold范围,Unity就会认为这是拖拽行为,按钮点击的响应自然就不会被触发。

解决方法

根据运行机子的DPI来动态改变EventSystem的DragThreshold

public class DragThresholdAdjustment : MonoBehaviour
{[SerializeField] private bool autoAdjust;[SerializeField] private float referenceValue = 40.0f;      // 参考值,按需求调整private void Awake(){if (autoAdjust){int dragThreshold = (int) Mathf.Ceil(UnityEngine.Screen.dpi / referenceValue);UnityEngine.EventSystems.EventSystem.current.pixelDragThreshold = dragThreshold;}}
}

http://www.ppmy.cn/news/476637.html

相关文章

电脑键盘出现计算机,电脑上出现了键盘怎么办

1. 电脑键盘没反应怎么办呢 1、如果按键所有都失灵的话,首先对键盘上的每个键进行盘查,有可能是一个键盘被按下去的缘故导致按其他键都没反应的情况。如果键盘损坏了,可能是键盘老化或者是键盘内部的线路板有污垢都会造成键盘接触不良而失灵的情况,这种情况建议更换一个新的…

笔记本电脑触摸板无法使用(失灵)解决方案 (win10和win7通用)

前提:笔记本电脑非损坏原因造成无法使用触摸板的情况 大家在使用笔记本电脑的时候可能有时候会有这样的情况,原本好好的笔记本电脑一不小心,触摸板就不能使用了,是不是很着急呢?还有的时候就是需要在不需要使用触摸板…

android手机屏幕总是闪烁,手机屏幕闪烁是什么原因

手机屏幕闪烁会严重影响到我们对手机的使用,那么在遇到这种情况的时候我们应该怎么解决呢?下面是小编精心为你整理的手机屏幕闪烁的原因,一起来看看。 手机屏幕闪烁的原因 其实很多时候是由于静电造成的,我们可以用以下的方法去除静电。用打…

手机触屏特效Java_手机触屏触摸特效javascript-TouchSwipe(依赖于jquery库)中文说明...

最近需要做一个手机小门户网站,因为目前主流的手机都是安卓和苹果的,他们的浏览器内核都是webkit,这就意味着手机网站是可以用html5和css3开发的,越开发越感觉到html5和css3的强大与它的重要性,且不谈html5和css3&…

【深入浅出C#】章节 4: 面向对象编程基础:类和对象的概念

类和对象是面向对象编程中最基本的概念,它们在程序设计中起着重要的作用。类是一种抽象的数据类型,用于描述具有相似属性和行为的一组对象。对象则是类的实例,代表了现实世界中的具体事物或概念。 面向对象编程的核心思想是将现实世界的事物抽…

NumPy常用方法(25个,含示例)

NumPy是Python中最流行的用于科学计算和数据分析的库之一。下面是常用的50个NumPy方法和函数,每个方法都有一个简单的示例: numpy.zeros:创建一个指定形状的全零数组。import numpy as np a = np.zeros((2, 3)) print(a) # Output: [[0. 0. 0.] # [0. 0. 0.]]numpy…

JavaGUI编程 学习+实战(贪吃蛇游戏,画画板等)

GUI编程学习 一,什么是GUI 图形用户界面(Graphical User Interface,简称 GUI,又称图形用户接口)是指采用图形方式显示的计算机操作用户界面。 图形用户界面是一种人与计算机通信的界面显示格式,允许用户…

linux技巧

是什么区分开普通的Linux用户和超级极客的呢?很简单:用在学习那些使长时工作转变为一瞬间工作的技巧、诀窍、秘诀和技术上的时间。如果你想提高效率而又不用做这些搜集资料的跑腿活儿,那我们已经收集了50多条简单易学的Linux技巧,…