• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >Android > Unity实现滑页嵌套(解决ScrollRect嵌套冲突问题)

Unity实现滑页嵌套(解决ScrollRect嵌套冲突问题)

作者:网友 字体:[增加 减小] 来源:互联网 时间:2017-05-26

网友通过本文主要向大家介绍了unity scrollrect,ugui scrollrect,scrollrect,unity3d scrollrect,as3 scrollrect等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

Unity实现滑页嵌套(解决ScrollRect嵌套冲突问题)


简介

由于项目需要+有网友咨询,所以做了个横向滑页+某一横向滑页中有竖向滑页的demo,实现有点绕弯子,但基本功能还是比较完善,发上来共享一下。

效果

这里写图片描述

思路

第一步的思路是自己判断触屏拖动位置,然后控制界面横向或者纵向滑动。
然后,
由于UGUI组件重叠时会屏蔽事件
比如Button会屏蔽掉PointerDown

(PS:当然也可以采取继承UGUI组件的方式释放屏蔽事件,
这里对UGUI源码不熟,采取自己写一个事件分发器方便一点)

项目配置

这里就不赘述咯,我的前一篇blog有详细配置说明:

1.首先建立两个ScrollRect

这里写图片描述

2.分别给两个ScrollRect配置格子的ScrollBar,然后关掉以下设置

这里写图片描述

3.在最外层的ScrollRect配置ScrollControl代码
(PS:代码后续给出)

这里写图片描述

4.配置InputControl
(PS:新建一个Gameobjct就可以咯,也可以挂在已有物体上)

这里写图片描述
这里写图片描述

5.运行,检查效果...

代码

代码写的比较急,很多不规范的地方,使用者请看懂逻辑之后自行重构,直接使用者有坑勿怪

InputControl

using UnityEngine;

public delegate void MouseDownEvent(Vector2 mousePosition);
public delegate void MouseUpEvent(Vector2 mousePosition);
public delegate void MouseDragEvent(Vector2 dragVector);
public delegate void MouseClickEvent(Vector2 mousePosition);

public class InputControl : MonoBehaviour
{

    private static InputControl mInstance;

    /// 
    /// 逗比单例模式
    /// 
    public static InputControl Instance
    {
        get
        {
            return mInstance;
        }
    }

    private bool isPress;
    private bool isClick;
    private bool tempPress;
    private Vector2 oldMousePosition;
    private Vector2 tempMousePosition;

    public event MouseDownEvent EVENT_MOUSE_DOWN;
    public event MouseUpEvent EVENT_MOUSE_UP;
    public event MouseDragEvent EVENT_MOUSE_DRAG;
    public event MouseClickEvent EVENT_MOUSE_CLICK;

    /// 
    /// 拖动起始判断参数,可自行更改
    /// 
    public const float JUDGE_DISTANCE = 1F;

    void Awake()
    {
        mInstance = this;

        //以下代码可优化
        EVENT_MOUSE_DOWN += AvoidEmpty;
        EVENT_MOUSE_UP += AvoidEmpty;
        EVENT_MOUSE_DRAG += AvoidEmpty;
        EVENT_MOUSE_CLICK += AvoidEmpty;
    }

    void Start()
    {
        isPress = false;
        isClick = false;
    }

    /// 
    /// 防空保护函数,无用处,可自行优化
    /// 
    ///
    private void AvoidEmpty(Vector2 noUse) { }

    void Update()
    {
        tempPress = Input.GetMouseButton(0);
        tempMousePosition = Input.mousePosition;
        // 两次状态不同,触发点击和抬起事件
        if (tempPress != isPress)
        {
            // 按下事件
            if (tempPress)
            {
                isClick = true;
                EVENT_MOUSE_DOWN(tempMousePosition);
            }
            // 抬起事件
            else
            {
                EVENT_MOUSE_UP(tempMousePosition);
                // 点击事件
                if (isClick)
                {
                    EVENT_MOUSE_CLICK(tempMousePosition);
                }
                isClick = false;
            }
        }
        // 按下的过程中发生了移动,发生事件变化
        else if (isClick && JudgeMove(oldMousePosition, tempMousePosition))
        {
            isClick = false;
        }
        // 拖动事件
        else if (tempPress && !isClick)
        {
            EVENT_MOUSE_DRAG(tempMousePosition - oldMousePosition);
        }

        isPress = tempPress;
        oldMousePosition = tempMousePosition;
    }

    /// 
    /// 判断是否超出静止范围,用static速度更快
    /// 
    ///
    ///
    /// 
    private static bool JudgeMove(Vector2 p1, Vector2 p2)
    {
        return Mathf.Abs(p1.x - p2.x) > JUDGE_DISTANCE || Mathf.Abs(p1.y - p2.y) > JUDGE_DISTANCE;
    }

}

ScrollControl

using UnityEngine;
using UnityEngine.UI;

public class ScrollControl : MonoBehaviour
{

    /// 
    /// 横向滚动条
    /// 
    public Scrollbar m_HScrollBar;

    /// 
    /// 竖向滚动条
    /// 
    public Scrollbar[] m_VScrollBars;

    /// 
    /// 有竖向滚动的页面
    /// 
    public int[] m_VScrollIndexs;

    /// 
    /// 页面个数
    /// 
    public int m_Num;

    /// 
    /// 设置移动超过多少百分比之后向下翻页
    /// 
    public float m_NextLimit;

    /// 
    /// 滑动敏感值
    /// 
    public float m_Sensitive;

    /// 
    /// 鼠标上一次的位置
    /// 
    private Vector3 mOldPosition;

    /// 
    /// 记录上一次的value
    /// 
    private float mOldValue;

    private float mTargetPosition = 0.5f;

    private int mCurrentIndex = 3;

    private int mTargetIndex = 3;

    /// 
    /// 是否可以移动
    /// 
    private bool mCanMove = false;

    /// 
    /// 初始移动速度
    /// 
    private float mMoveSpeed;

    /// 
    /// 平滑移动参数
    /// 
    private const float SMOOTH_TIME = 0.2F;

    private float mDragParam = 0;
    private float mPageWidth = 0;

    /// 
    /// 是否需要进行滑动方向判定
    /// 
    private bool mNeedCaculate = false;

    /// 
    /// 是否进行竖向滚动
    /// 
    private bool mIsScollV = false;

    /// 
    /// 竖向临时滚动条
    /// 
    private Scrollbar mVScrollBar;

    public void SetNextIndex(int pIndex)
    {
        mTargetIndex = pIndex;
        mTargetPosition = (mTargetIndex - 1) * mPageWidth;
        mIsScollV = false;
        mCanMove = true;
    }

    private void OnPointerDown(Vector2 mousePosition)
    {
        // 记录当前value
        mOldValue = m_HScrollBar.value;
        mOldPosition = Input.mousePosition;
        // mCanMove = false;
        mCurrentIndex = GetCurrentIndex(mOldValue);
        // 判断当前是否在可竖向滑动的页面上
        for (int i = 0; i < m_VScrollIndexs.Length; ++i)
        {
            if (m_VScrollIndexs[i] == mCurrentIndex)
            {
                mNeedCaculate = true;
                mVScrollBar = m_VScrollBars[i];
                break;
            }
        }
    }

    private void OnDrag(Vector2 mousePosition)
    {

        Vector2 dragVector = Input.mousePosition - mOldPosition;

        if (mNeedCaculate)
        {
            mNeedCaculate = false;

            if (Mathf.Abs(dragVector.x) > Mathf.Abs(dragVector.y))
            {
                mIsScollV = false;
            }
            else
            {
                mIsScollV = true;
            }
        }

        DragScreen(dragVector);

        mOldPosition = Input.mousePosition;
    }

    private void OnPointerUp(Vector2 mousePosition)
    {
        Vector2 dragVector = Input.mousePosition - mOldPosition;
        DragScreen(dragVector);

        mOldPosition = Input.mousePosition;

        float



 
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • Unity实现滑页嵌套(解决ScrollRect嵌套冲突问题)

相关文章

  • 2017-05-26android:从另外一个activity中返回数据
  • 2017-05-26framework层和native层实现联网控制(iptable方式),nativeiptable
  • 2017-05-26Android 5.0(包含5.0以下版本) 获取栈顶应用程序包名,android包名
  • 2017-05-26Kotlin中的“忍者”函数 —— 理解泛型的能力(KAD 12),kotlinkad
  • 2017-05-26Android 5.0(棒棒糖))十大新特性,android新特性
  • 2017-05-26ORA-16038/ORA-00742: Log read detects lost write in thread
  • 2017-05-26基于zookeeper的主备切换方法
  • 2017-05-26关于Android滑动冲突的解决方法(二)
  • 2017-05-26仿有道词典应用项目源码,有道词典项目源码
  • 2017-05-26KeyEvent机制(按键),keyevent机制按键

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • Android中Window添加View的底层原理
    • Android开发笔记(9)——初步设置Menu,androidmenu
    • Android--字符串和Drawable之间互相转化,android--drawable
    • JAVA Web day01--- Android小白的第一天学习笔记,day01---android
    • 安卓图片滑动,实现带小点的导航页面效果,安卓小点
    • android开发网络连接工具类(一),android工具类
    • Android手机输入法按键监听-dispatchKeyEvent
    • EditText的setSelection属性,setselection
    • [android] 手机卫士自定义控件的属性,android卫士
    • HBase Java编程示例

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有