目前,ScrollRect
在移动的设备上的多点触控方面存在严重缺陷。
如果你自己尝试一下,你会发现只要你把两个手指放在屏幕上,内容就会跳来跳去,并产生一些意想不到的行为。
对此有什么解决方案吗?目前,this是我找到的唯一解决方案,但在某些情况下它仍然有缺陷,最重要的是,不能确定屏幕上所有手指的平均输入位置(或MultiTouchPosition
)。
下面是UnityUIExtensions
bitbucket中MultiTouchScrollRect.cs
脚本的修改版本,但每次我将下一个手指放在屏幕上时,它都会跳转:
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;
public class MultiTouchScrollRect : ScrollRect
{
private int minimumTouchCount = 1, maximumTouchCount = 2, pointerId = -100;
public Vector2 MultiTouchPosition
{
get
{
Vector2 position = Vector2.zero;
for (int i = 0; i < Input.touchCount && i < maximumTouchCount; i++)
{
position += Input.touches[i].position;
}
position /= ((Input.touchCount <= maximumTouchCount) ? Input.touchCount : maximumTouchCount);
return position;
}
}
public override void OnBeginDrag(PointerEventData eventData)
{
if (Input.touchCount >= minimumTouchCount)
{
pointerId = eventData.pointerId;
eventData.position = MultiTouchPosition;
base.OnBeginDrag(eventData);
}
}
public override void OnDrag(PointerEventData eventData)
{
if (Input.touchCount >= minimumTouchCount)
{
eventData.position = MultiTouchPosition;
if (pointerId == eventData.pointerId)
{
base.OnDrag(eventData);
}
}
}
public override void OnEndDrag(PointerEventData eventData)
{
if (Input.touchCount >= minimumTouchCount)
{
pointerId = -100;
eventData.position = MultiTouchPosition;
base.OnEndDrag(eventData);
}
}
}
感谢您抽出宝贵时间!
3条答案
按热度按时间jfewjypa1#
对于那些感兴趣的人,这是我编写的扩展ScrollRect类,它修复了这个问题:
cygmwpex2#
试试 这个 ( 尚未 测试 ) :
中 的 每 一 个
由于 您 要 处理 的 接触 量 只能 是 一 个 或 两 个 , 因此 最 好 以 不同 的 方式 处理 每个 案例 。
我 不 知道 你 为什么 要 划分 位置 , 位置 是 一 个 Vector2 , 你 需要 计算 它们 之间 的 中点 , 这 可以 用 Vector2.Lerp 来 完成 ( 0.5f 决定 你 想要 的 中点 )
t2a7ltrp3#
我有一个替代的实现,使用第一次触摸作为起点,并根据每次触摸的偏移进行更新。