目前有个需求父物体的scrollView 需要垂直滑动,子物体的scrollView需要水平滑动,因为用原生的滑动会导致事件冲突,因为解决方案为通过通过子物体的 滑动事件监听 然后去调用父物体的 滑动事件
public class ScrollRectEx : MonoBehaviour, IBeginDragHandler, IDragHandler, IEndDragHandler
{/// <summary>
/// 外层被拦截需要正常拖动的ScrollRect,可不指定,默认在父对象中找
/// </summary>
public ScrollRect anotherScrollRect;
private ScrollRect thisScrollRect;
public bool isHorizontal = false;
void Awake()
{
thisScrollRect = GetComponent<ScrollRect>();
}
public void Init(ScrollRect parentScroll)
{
anotherScrollRect = parentScroll;
}
public void OnBeginDrag(PointerEventData eventData)
{
if (anotherScrollRect != null)
{
anotherScrollRect.OnBeginDrag(eventData);
}
}
public void OnDrag(PointerEventData eventData)
{
if (anotherScrollRect != null)
{
//anotherScrollRect.OnDrag(eventData);
float angle = Vector2.Angle(eventData.delta, Vector2.up);
///Debug.LogError(angle+"|"+eventData);
//判断拖动方向,防止水平与垂直方向同时响应导致的拖动时整个界面都会动
if (angle > 45f && angle < 135f)
{
thisScrollRect.enabled = !isHorizontal;
anotherScrollRect.enabled = isHorizontal;
Vector2 dalte = new Vector2(eventData.delta.x, 0);
eventData.delta = dalte;
thisScrollRect.OnDrag(eventData);
}
else
{
anotherScrollRect.enabled = !isHorizontal;
thisScrollRect.enabled = isHorizontal;
Vector2 dalte = new Vector2(0, eventData.delta.y);
eventData.delta = dalte;
anotherScrollRect.OnDrag(eventData);
}
}
}
public void OnEndDrag(PointerEventData eventData)
{
if (anotherScrollRect != null)
{
anotherScrollRect.OnEndDrag(eventData);
anotherScrollRect.enabled = true;
thisScrollRect.enabled = true;
}
}
}