当scrollRect中的一个个子元素也分别是scorllRect时(子scorllRect和父scorllRect运动方向不一样),根据手指的移动判断是响应子scorllRect的drag事件,还是响应父scorllRect的drag事件。
先看效果:

代码如下
public class VHScrollRect : ScrollRect
{
public ScrollRect parentScroll;
public bool isVertical = false;
private bool isSelf = false;
public override void OnBeginDrag(PointerEventData eventData)
{
Vector2 touchDeltaPosition;
#if UNITY_EDITOR
float delta_x = Input.GetAxis("Mouse X");
float delta_y = Input.GetAxis("Mouse Y");
touchDeltaPosition = new Vector2(delta_x, delta_y);
#endif
#if UNITY_ANDROID && !UNITY_EDITOR
touchDeltaPosition = Input.GetTouch(0).deltaPosition;
#endif
if (isVertical)
{
if (Mathf.Abs(touchDeltaPosition.x) < Mathf.Abs(touchDeltaPosition.y))
{
isSelf = true;
base.OnBeginDrag(eventData);
}
else
{
isSelf = false;
parentScroll.OnBeginDrag(eventData);
}
}
else
{
if (Mathf.Abs(touchDeltaPosition.x) > Mathf.Abs(touchDeltaPosition.y))
{
isSelf = true;
base.OnBeginDrag(eventData);
}
else
{
isSelf = false;
parentScroll.OnBeginDrag(eventData);
}
}
}
public override void OnDrag(PointerEventData eventData)
{
if (isSelf)
{
base.OnDrag(eventData);
}
else
{
parentScroll.OnDrag(eventData);
}
}
public override void OnEndDrag(PointerEventData eventData)
{
if (isSelf)
{
base.OnEndDrag(eventData);
}
else
{
parentScroll.OnEndDrag(eventData);
}
}
}
调用前将
parentScroll
赋值即可。
效果为水平或者垂直移动时都是相对独立的,不会同时触发。
感谢soctti的帮助 : 他的博客
本文探讨了在Unity中,当ScrollRect的子元素也是ScrollRect时,如何根据手指移动判断并处理水平和垂直滚动事件,确保两者独立工作,不互相干扰。文中提供了相关代码示例,并表达了对soctti帮助的感谢。
1172

被折叠的 条评论
为什么被折叠?



