嵌套式ScrollRect滑动同步

**功能解释:A【ScrollRect】竖直滑动列表下有多个Item,每个Item中有一个水平滑动列表B【ScrollRect】:
如果想要实现按压竖直滑动B时,A要对应的进行竖直滑动;
水平滑动B时,则只有B进行水平滑动;
可采用以下方法实现:**
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;

public class AdvancedVerticalScrollRect : ScrollRect
{
    public enum Direction
    {
        Horizontal,
        Vertical,
    }

    [HideInInspector]
    public ScrollRect ParentScrollRect;

    //自身的滚动方向
    private Direction mSelfDirection;
    // 拖拽方向
    private Direction mCurDragDrection;

    // 在拖动开始时,检查是否应该传递事件到父ScrollRect
    public override void OnBeginDrag(PointerEventData eventData)
    {
        mSelfDirection = horizontal ? Direction.Horizontal : Direction.Vertical;
        mCurDragDrection = Mathf.Abs(eventData.delta.y) > Mathf.Abs(eventData.delta.x) ? Direction.Vertical : Direction.Horizontal;
        if (mSelfDirection != mCurDragDrection && ParentScrollRect!= null)
        {
            //拖拽方向和当前组件的滚动方向不一样时,同步拖拽数据到父级ScrollRect
            ParentScrollRect.OnBeginDrag(eventData);
            return;
        }
        base.OnBeginDrag(eventData);
    }

    // 在拖动过程中,处理竖直滑动
    public override void OnDrag(PointerEventData eventData)
    {
        if (mSelfDirection != mCurDragDrection && ParentScrollRect != null)
        {
            ParentScrollRect.OnDrag(eventData);
            return;
        }
        base.OnDrag(eventData);
    }

    // 在拖动结束时
    public override void OnEndDrag(PointerEventData eventData)
    {
        if (mSelfDirection != mCurDragDrection && ParentScrollRect != null)
        {
            ParentScrollRect.OnEndDrag(eventData);
            return;
        }
        base.OnEndDrag(eventData);
    }


    // 用户滚动时调用
    public override void OnScroll(PointerEventData data)
    {
        if (mSelfDirection != mCurDragDrection && ParentScrollRect != null)
        {
            ParentScrollRect.OnScroll(data);
            return;
        }
        base.OnScroll(data);

    }

}

using System.Collections;
using System.Collections.Generic;
using UnityEditor;
using UnityEngine;
using UnityEngine.UI;


[CustomEditor(typeof(AdvancedVerticalScrollRect))]
public class AdvancedVerticalScrollRectEditor : Editor
{
    public override void OnInspectorGUI()
    {
        AdvancedVerticalScrollRect myTarget = (AdvancedVerticalScrollRect)target;
        // 保留原有
        base.DrawDefaultInspector();

        EditorGUILayout.Space();
        EditorGUILayout.LabelField("Custom Properties", EditorStyles.boldLabel);

        // 自定义字段的绘制
        myTarget.ParentScrollRect = (ScrollRect)EditorGUILayout.ObjectField(
            "Parent Scroll Rect",
            myTarget.ParentScrollRect,
            typeof(ScrollRect),
            true);

        // 如果需要保存对目标对象所做的更改
        if (GUI.changed)
        {
            EditorUtility.SetDirty(target);
        }
    }

}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值