ScrollView小拓展

一个ScrollView页面允许上下滑动,在这个页面内部有多个小的ScrollView需要左右滑动,此时玩家如何决定是上下滑动还是左右滑动?

代码逻辑如下

1、初始版:将手指的左右移动放到内部,上下移动放到外部

using UnityEngine.EventSystems;
using UnityEngine.UI;

namespace Wogame
{
    public class ScrollRectExpand : ScrollRect
    {
        private ScrollRect ScrollRect;
        public void Init(ScrollRect mScrollRect)
        {
            ScrollRect = mScrollRect;
        }

        public override void OnBeginDrag(PointerEventData eventData)
        {
            base.OnBeginDrag(eventData);
            if (ScrollRect != null) 
            {
                ScrollRect.OnBeginDrag(eventData);
            }            
        }

        public override void OnEndDrag(PointerEventData eventData)
        {
            base.OnEndDrag(eventData);
            if (ScrollRect != null)
            {
                ScrollRect.OnEndDrag(eventData);
            }
        }

        public override void OnDrag(PointerEventData eventData)
        {
            base.OnDrag(eventData);
            if (ScrollRect != null)
            {
                ScrollRect.OnDrag(eventData);
            }
        }
    }
}

 

2、复杂版,通过手指的按下第一个点和滑动确定的第二个点,计算出玩家的上下和左右偏移量,比较两个偏移量的值,如果x > y,那么代表玩家想要左右滑动,后面玩家无论怎么滑动,都只会把内部的ScrollView左右滑动,如果x < y,那么代表玩家想要上下滑动,后面玩家无论怎么滑动,都只会把外部的ScrollView上下滑动,注意,一旦玩家抬起手指,本次滑动效果即失效,下次按下将会重新确定方向

using System;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;

namespace Wogame
{
    public class ScrollRectExpand1 : ScrollRect
    {
        private ScrollRect ScrollRect;
        private Vector2 StartPos;       //记录按下的初始状态
        private int CurrStatus = 0;     //当前滑动状态,1:内部滑动,2:外部滑动
        public void Init(ScrollRect mScrollRect)
        {
            ScrollRect = mScrollRect;
            CurrStatus = 0;
        }

        public override void OnBeginDrag(PointerEventData eventData)
        {
            base.OnBeginDrag(eventData);            
            if (ScrollRect != null) 
            {
                ScrollRect.OnBeginDrag(eventData);
            }
            StartPos = eventData.position;
        }

        public override void OnDrag(PointerEventData eventData)
        {            
            if (CurrStatus == 0)
            {
                if (Math.Abs(eventData.position.x - StartPos.x) > Math.Abs(eventData.position.y - StartPos.y))
                {
                    CurrStatus = 1;
                }
                else if(Math.Abs(eventData.position.x - StartPos.x) < Math.Abs(eventData.position.y - StartPos.y))
                {
                    CurrStatus = 2;
                }
            }
            if (CurrStatus == 1)
            {
                base.OnDrag(eventData);
            }
            else
            {
                if (ScrollRect != null)
                {
                    ScrollRect.OnDrag(eventData);
                }
            }            
        }

        public override void OnEndDrag(PointerEventData eventData)
        {
            CurrStatus = 0;
            if (CurrStatus == 1)
            {
                base.OnEndDrag(eventData);
            }
            else
            {
                if (ScrollRect != null)
                {
                    ScrollRect.OnEndDrag(eventData);
                }
            }            
        }
    }
}

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值