Unity3D实现页面的滑动切换功能

效果展示

Unity3D实现页面的滑动切换 效果

文章目录

  • 前言
  • 一、先上代码
  • 二、创建UI
    • 1.创建Scroll View如下图,并挂载该脚本:
    • 2.Content下创建几个Itme
  • 总结


前言

``

好记性不如烂笔头!

一、先上代码

/**********************************************************************
 文件信息
 文件名(File Name):                PageView.cs
 作者(Author):                      TianWenQuan
 创建时间(CreateTime):             #CREATETIME#
 **********************************************************************/
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.EventSystems;
using System;
namespace Twq
{
    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    using UnityEngine.UI;
    using UnityEngine.EventSystems;
    using System;
    using UnityEngine.Events;
    using System.Reflection;
    //using RenderHeads.Media.AVProVideo.Demos;
    //using RenderHeads.Media.AVProVideo;

    /// <summary>
    /// 滑动页面效果
    /// </summary>
    public class PageView : MonoBehaviour, IBeginDragHandler, IEndDragHandler
    {
        public static PageView pageViewIn;
        private ScrollRect rect;
        private float targethorizontal = 0;
        private List<float> posList = new List<float>();//存四张图片的位置(0, 0.333, 0.666, 1) 
        private bool isDrag = true;
        private float startTime = 0;
        private float startDragHorizontal;
        private int curIndex = 0;

        public float speed = 2;      //滑动速度  
        public float sensitivity = 0;
        public Text curPage;

        public Transform Content;
       // public GameObject MediaPlayerUI_;
        //public MediaPlayer MediaPlayer_;

        public Transform PageList;//页面List
        public Button LeftButton;
        public Button RightButton;
        void Awake()
        {
            pageViewIn = this;
          
            LeftButton.onClick.AddListener(OnLeftButton);
            RightButton.onClick.AddListener(OnRightButton);
            for (int i = 0; i < PageList.childCount; i++)
            {
                int x = i;
                PageList.GetChild(x).transform.GetComponent<Toggle>().onValueChanged.AddListener((b) => {
                    if (b)
                    {
                        pageTo(x);
                    }
                });
            }


            rect = GetComponent<ScrollRect>();
            Debug.Log("rect.content.rect.width="+ rect.content.rect.width);
            Debug.Log(" GetComponent<RectTransform>().rect.width=" + GetComponent<RectTransform>().rect.width);
            float horizontalLength = rect.content.rect.width - GetComponent<RectTransform>().rect.width;
            Debug.Log(horizontalLength);
            var _rectWidth = GetComponent<RectTransform>().rect.width;
            Debug.Log(_rectWidth);
            Debug.Log(rect.content.transform.childCount);
            for (int i = 0; i < rect.content.transform.childCount; i++)
            {
                Debug.Log("---"+ (_rectWidth * i / horizontalLength).ToString());
                posList.Add(_rectWidth * i / horizontalLength);   //存四张图片的位置
            }
            curIndex = 0;
            curPage.text = String.Format("当前页码:0");
            Content.parent.parent.GetComponent<ScrollRect>().normalizedPosition = new Vector2(0, 1);
            LayoutRebuilder.ForceRebuildLayoutImmediate(Content.GetComponent<RectTransform>());
        }
       

        void Update()
        {
            if (!isDrag)
            {
                startTime += Time.deltaTime;
                float t = startTime * speed;
                //加速滑动效果
                rect.horizontalNormalizedPosition = Mathf.Lerp(rect.horizontalNormalizedPosition, targethorizontal, t);
                //缓慢匀速滑动效果
                // rect.horizontalNormalizedPosition = Mathf.Lerp(rect.horizontalNormalizedPosition, targethorizontal, Time.deltaTime * speed);

            }
        }
        /// <summary>
        /// 开始拖拽
        /// </summary>
        /// <param name="eventData"></param>
        public void OnBeginDrag(PointerEventData eventData)
        {
            Debug.Log("----开始拖动");
            isDrag = true;
            //开始拖动
            startDragHorizontal = rect.horizontalNormalizedPosition;  //horizontalNormalizedPosition这个参数是scrollRect滑动期间变化的x坐标值,在(0, 1)之间
        }

        /// <summary>
        /// 拖拽结束
        /// </summary>
        /// <param name="eventData"></param>
        public void OnEndDrag(PointerEventData eventData)
        {
            Debug.Log("拖动结束");
            float posX = rect.horizontalNormalizedPosition;
            int index = 0;
            float offset = Mathf.Abs(posList[index] - posX);  //计算当前位置与第一页的偏移量,初始化offect
            for (int i = 1; i < posList.Count; i++)
            {    //遍历页签,选取当前x位置和每页偏移量最小的那个页面
                float temp = Mathf.Abs(posList[i] - posX);
                if (temp < offset)
                {
                    index = i;
                    offset = temp;
                }
            }
            curIndex = index;
            targethorizontal = posList[curIndex]; //设置当前坐标,更新函数进行插值  
            isDrag = false;
            startTime = 0;
            curPage.text = String.Format("当前页码:{0}", curIndex.ToString());
            PageList.GetChild(curIndex + 1).transform.GetComponent<Toggle>().isOn = true;
        }
        
        /// <summary>
        /// 左边下一页 按钮
        /// </summary>
        public void OnLeftButton()
        {
            // Debug.Log("curIndex" + curIndex + "   posList.Count=" + PageList.childCount);
            if (curIndex <= 0)
            {
                 Debug.Log("左边不能点击了");
                return;
            }
            curIndex -= 1;
            PageList.GetChild(curIndex).transform.GetComponent<Toggle>().isOn = true;
            pageTo(curIndex);


        }
        /// <summary>
        /// 右边下一页 按钮
        /// </summary>
        public void OnRightButton()
        {
            // Debug.Log("curIndex" + curIndex + "  PageList=" + PageList.childCount);
            if (curIndex >= PageList.childCount - 1)
            {
                 Debug.Log("右边不能点击了");
                return;
            }
            curIndex += 1;
            PageList.GetChild(curIndex).transform.GetComponent<Toggle>().isOn = true;
            pageTo(curIndex);
        }

        /// <summary>
        /// 翻页
        /// </summary>
        /// <param name="index"></param>
        public void pageTo(int index)
        {
            if (index < 0) { return; }
            // Debug.Log("pageTo......index="+ index);
            curIndex = index;
            targethorizontal = posList[curIndex]; //设置当前坐标,更新函数进行插值  
            isDrag = false;
            startTime = 0;
            curPage.text = String.Format("当前页码:{0}", curIndex.ToString());
          //  MediaPlayer_.Stop();
            //MediaPlayerUI_.SetActive(false);
            if (index==1)
            {
             //   MediaPlayerUI_.SetActive(true);
            }
        }
    }
}




二、创建UI

1.创建Scroll View如下图,并挂载该脚本:

在这里插入图片描述

2.Content下创建几个Itme

在这里插入图片描述对齐方式,可以根据需求使用以下:
在这里插入图片描述!
因为代码里需要使用到Content的宽,让其自动填充宽度。最后删除该组件Content Size Fitte(不删除,可以自己尝试下,会影响我们要的翻动效果)
在这里插入图片描述
Content的对齐位置如下:
在这里插入图片描述
创建左右按钮和12345翻页按钮,就不仔细写了,都是调用脚本里的方法而已。

在这里插入图片描述


总结

好记性不如烂笔头

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/114374.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

前端性能分析工具

前段时间在工作中,需要判断模块bundle size缩减对页面的哪些性能产生了影响, 因此需要了解前端的性能指标如何定义的,以及前端有哪些性能分析工具, 于是顺便整理了一篇笔记, 以供前端小白对性能这块知识点做一个入门级的了解. 页面渲染 在了解性能指标和分析工具之前,有必要先…

怎样去除视频中的杂音,保留人声部分?

怎样去除视频中的杂音&#xff0c;保留人声部分&#xff1f;这个简单嘛&#xff01;两种办法可以搞定&#xff1a;一是进行音频降噪&#xff0c;把无用的杂音消除掉&#xff1b;二是提取人声&#xff0c;将要保留的人声片段提取出来。 这就将两种实用的办公都分享出来&#xf…

datagrip出现 java.net.ConnectException: Connection refused: connect.

出现这样的情况要看一下hadoop有没有启动 start-all.sh nohup /export/server/apache-hive-3.1.2-bin/bin/hive --service hiveserver2 & scp -r /export/server/apache-hive-3.1.2-bin/ node3:/export/server/ /export/server/apache-hive-3.1.2-bin/bin/hive show databa…

Apache POI

文章目录 一、Apache POI介绍二、应用场景三、使用步骤1.导入maven坐标2.写入代码讲解3.读取代码讲解 一、Apache POI介绍 Apache POI 是一个处理Miscrosoft Office各种文件格式的开源项目。简单来说就是&#xff0c;我们可以使用 POI 在 Java 程序中对Miscrosoft Office各种文…

pytorch 笔记:GRU

1 介绍 对于输入序列中的每个元素&#xff0c;每一层都计算以下函数&#xff1a; ht​ 是t时刻 的隐藏状态xt​ 是t时刻 的输入ht−1​ 是 t-1时刻 同层的隐藏状态或 0时刻 的初始隐藏状态rt​,zt​,nt​ 分别是重置门、更新门和新门。σ 是 sigmoid 函数∗ 是 Hadamard 乘积。…

coalesce函数(SQL )

用途&#xff1a; 将控制替换成其他值&#xff1b;返回第一个非空值 表达式 COALESCE是一个函数&#xff0c; (expression_1, expression_2, …,expression_n)依次参考各参数表达式&#xff0c;遇到非null值即停止并返回该值。如果所有的表达式都是空值&#xff0c;最终将返…

HarmonyOS鸿蒙原生应用开发设计- 元服务(原子化服务)图标

HarmonyOS设计文档中&#xff0c;为大家提供了独特的元服务图标&#xff0c;开发者可以根据需要直接引用。 开发者直接使用官方提供的元服务图标内容&#xff0c;既可以符合HarmonyOS原生应用的开发上架运营规范&#xff0c;又可以防止使用别人的元服务图标侵权意外情况等&…

关于网络编程的3个问题

一、TCP 和 UDP 可以同时绑定相同的端口吗&#xff1f; 答案&#xff1a;可以的 在数据链路层中&#xff0c;通过 MAC 地址来寻找局域网中的主机。在网络层中&#xff0c;通过 IP 地址来寻找网络中互连的主机或路由器。在传输层中&#xff0c;需要通过端口进行寻址&#xff0…

SpringCloud(五) Eureka与Nacos的区别

SpringCloud(二) Eureka注册中心的使用-CSDN博客 SpringCloud(四) Nacos注册中心-CSDN博客 在这两篇博文中我们详细讲解了Eureka和Nacos分别作为微服务的注册中心的使用方法和注意事项,但是两者之间也有一些区别. 一, Nacos实例分类 Nacos实例分为两种类型: 临时实例:如果实例…

[common c/c++] ring buffer/circular buffer 环形队列/环形缓冲区

前言&#xff1a; ring buffer / circular buffer 又名环形队列 / 环形缓冲区&#xff0c;其通过开辟固定尺寸的内存来实现反复复用同一块内存的目的。由于预先开辟了固定尺寸的内容&#xff0c;所以当数据满的时候&#xff0c;可以有两种处理方式&#xff0c;具体使用哪一种按…

思路视野杂志思路视野杂志社思路视野编辑部2023年第24期目录

公共文化 公共图书馆文旅融合实践与模式思考 白雪1-3 公共图书馆管理与服务创新路径分析 陈静4-6 提升办公室文书档案管理工作的实践探讨 黄强7-9 《思路视野》投稿邮箱&#xff1a;cn7kantougao163.com(注明投稿“《思路视野》”) 崔编辑Q Q &#xff1a;296078736 微信号&am…

ajax-axios发送 get请求 或者 发送post请求带有请求体参数

/* axios v0.21.1 | (c) 2020 by Matt Zabriskie */ !function(e,t){"object"typeof exports&&"object"typeof module?module.exportst():"function"typeof define&&define.amd?define([],t):"object"typeof export…

瑞明达:聚“追梦”之力,共圆“经济梦”

矢志不渝&#xff0c;笃行不怠&#xff0c;争当“一心一意同国行”的无悔“追梦人”。过往几年&#xff0c;国际形势风高浪急&#xff0c;国内环境复杂多变&#xff0c;在后疫情时代、经济恢复压力等多种超预期的因素冲击下&#xff0c;瑞明达团队全面贯彻落实国家发展政策&…

为什么 SIEM 是抵御网络威胁的最佳防御手段

随着 IT 服务和基础设施趋向于混合模式&#xff0c;以及最近数据的激增&#xff0c;组织必须拥有一个集中式安全解决方案来跟踪用户的行为和关键安全事件。 威胁行为者越来越善于检测和利用组织网络中的漏洞&#xff0c;网络攻击也在不断发展。虽然管理员可以对已经发生的攻击…

USART HMI串口屏+单片机通讯上手体验

USART HMI串口屏单片机通讯上手体验 &#x1f516;本文采用淘晶驰4.3寸IPS串口屏实物验证&#xff0c;HMI串口屏经简单配置即可快速实现&#xff0c;串口通讯效果。串口屏上手简单&#xff0c;有独立的开发套件&#xff0c;容易上手&#xff0c;驱动显示和功能代码独立。本文仅…

ipv6简单实验案例

R1配置&#xff1a; ipv6 interface GigabitEthernet0/0/0 ipv6 enable ipv6 address auto global ipv6 route-static 2001:21:: 64 2001:12::1 R2配置&#xff1a; ipv6 dhcp enable dhcpv6 pool test address prefix 2001:21::/64 excluded-address 2001:21::1 interface Gi…

EasyExcel复杂表头数据导入

目录 表头示例导入代码数据导出 表头示例 导入代码 Overridepublic void importExcel(InputStream inputStream) {ItemExcelListener itemExcelListener new ItemExcelListener();EasyExcel.read(inputStream, ImportItem.class, itemExcelListener).headRowNumber(2).sheet()…

深入了解汽车级功率MOSFET NVMFS2D3P04M8LT1G P沟道数据表

汽车级功率MOSFET是一种专门用于汽车电子领域的功率MOSFET。它具有高电压、高电流、高温、高可靠性等特点&#xff0c;能够满足汽车电子领域对功率器件的严格要求。汽车级功率MOSFET广泛应用于汽车电机驱动、泵电机控制、车身控制等方面&#xff0c;能够提高汽车电子系统的效率…

Java进阶(List)——面试时List常见问题解读 结合源码分析

前言 List、Set、HashMap作为Java中常用的集合&#xff0c;需要深入认识其原理和特性。 本篇博客介绍常见的关于Java中List集合的面试问题&#xff0c;结合源码分析题目背后的知识点。 关于的Set的博客文章如下&#xff1a; Java进阶&#xff08;Set&#xff09;——面试时…

9.Vue前端使用iframe集成帆软报表的单点登录

一、背景 需要把帆软报表内嵌到若依里面来。 二、帆软设置 2.1 帆软报表的url 打开帆软后端里面的【目录管理】查看具体报表的url 帆软报表的具体地址为: Frm聚合报表地址: 【帆软的服务http】+【/webroot/decision/view/form?viewlet=demo/demo.frm】 CPT普通报表的地…