【发布时间】:2019-05-20 12:32:31
【问题描述】:
目前,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);
}
}
}
感谢您的宝贵时间!
【问题讨论】:
-
好吧,如果你想要所有触摸之间的平均触摸位置......为什么当你添加触摸时它会跳转到另一个位置?例如之间的中心两点显然与第一点不一样……那么你期望会发生什么?
-
@derHugo 我正在尝试复制 iOS 照片查看器,因此您可以想象,当您将第二根手指向下放以进行缩放时,它不应该移动。
-
那为什么不简单地坚持第一个而不是平均呢?
-
@derHugo 请亲自尝试一下。当您向下放置 2 个或更多手指时,Unity 的 ScrollRect 会出现问题。我正在寻找一种方法来解决这个问题。
-
正如我所说,为什么不简单地只用第一根手指滚动而忽略其他手指,只使用其他手指进行缩放?