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;//页面Listpublic 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);  //计算当前位置与第一页的偏移量,初始化offectfor (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翻页按钮,就不仔细写了,都是调用脚本里的方法而已。

在这里插入图片描述


总结

好记性不如烂笔头

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

日语动词三分类

所有的动词原形都是由う段结尾 50音图 一类动词 一类动词又称五段动词&#xff08;う段动词&#xff09; 1.结尾是う段非る的动词 日文平假名中文書くかく写探すさがす寻找勝つかつ胜利遊ぶあそぶ玩耍読むよむ阅读 2.あ段る、う段る、お段る 日文平假名中文困るこまる使为…

汇编语言(举个栗子)

汇编语言&#xff08;Assembly Language&#xff09;是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言&#xff0c;亦称为符号语言。在汇编语言中&#xff0c;用助记符代替机器指令的操作码&#xff0c;用地址符号或标号代替指令或操作数的地址。在不同…

云尘-Node1 js代码

继续做题 拿到就是基本扫一下 nmap -sP 172.25.0.0/24 nmap -sV -sS -p- -v 172.25.0.13 然后顺便fscan扫一下咯 nmap: fscan: 还以为直接getshell了 老演员了 其实只是302跳转 所以我们无视 只有一个站 直接看就行了 扫出来了两个目录 但是没办法 都是要跳转 说明还是需要…

竞赛选题 深度学习实现行人重识别 - python opencv yolo Reid

文章目录 0 前言1 课题背景2 效果展示3 行人检测4 行人重识别5 其他工具6 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; **基于深度学习的行人重识别算法研究与实现 ** 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0c…

【实战Flask API项目指南】之三 路由和视图函数

实战Flask API项目指南之 路由和视图函数 本系列文章将带你深入探索实战Flask API项目指南&#xff0c;通过跟随小菜的学习之旅&#xff0c;你将逐步掌握 Flask 在实际项目中的应用。让我们一起踏上这个精彩的学习之旅吧&#xff01; 前言 当小菜踏入Flask后端开发的世界时&…

Pytorch从零开始实战08

Pytorch从零开始实战——YOLOv5-C3模块实现 本系列来源于365天深度学习训练营 原作者K同学 文章目录 Pytorch从零开始实战——YOLOv5-C3模块实现环境准备数据集模型选择开始训练可视化模型预测总结 环境准备 本文基于Jupyter notebook&#xff0c;使用Python3.8&#xff0c…

ROS学习笔记(4):ROS架构和通讯机制

前提 前4篇文章以及帮助大家快速入门ROS了&#xff0c;而从第5篇开始我们会更加注重知识积累。同时我强烈建议配合B站大学的视频一起服用。 1.ROS架构三层次&#xff1a; 1.基于Linux系统的OS层&#xff1b; 2.实现ROS核心通信机制以及众多机器人开发库的中间层&#xff1b…

Openssl数据安全传输平台019:外联接口类的封装以及动态库的制作 - Bug未解决,感觉不是代码的问题

文章目录 1 外联接口1.1 接口类的封装1.2 共享内存与配置文件 2 json格式配置文件的定义2.1 共享内存中存储的节点结构2.2 服务器端配置文件2.3 客户端配置文件2.4 改进配置文件 3 共享内存类修改4 将接口打包成库(静态/动态)4.1 相关的指令4.1.1 静态库4.1.2 动态库 4.2 外联接…

docker compose实现容器编排

Compose 使用的三个步骤&#xff1a; 使用 Dockerfile 定义应用程序的环境 使用 compose.yml 定义构成应用程序的服务&#xff0c;这样它们可以在隔离环境中一起运行 最后&#xff0c;执行 docker compose up 命令来启动并运行整个应用程序 为什么需要docker compose Dock…

Istio 实战

文章目录 Istio流量管理分享会【1】什么是istio?【2】istio 可以干什么?【3】业务中的痛点?【4】istio 高级流量管理5.1 istio 组件介绍与原理5.2 sidercar何时注入?如何控制是否注入?5.3 查看sidecar 容器插入的容器中的iptablesDestination RuleVirtual ServiceGateways…

Go语言集成开发环境(IDE):GoLand 2023中文

GoLand 2023是一款由JetBrains开发的现代化、功能丰富的Go语言集成开发环境&#xff08;IDE&#xff09;。它提供了智能代码提示和自动完成、强大的内置调试器以及代码重构工具&#xff0c;帮助开发者提高编码效率并确保代码质量。GoLand 2023还支持多种版本控制系统&#xff0…

力扣:有效的括号

自己编写的代码 。 自己的思路&#xff1a; class Solution { private:unordered_map<char,int>symbolValues{{(,1},{),2},{{,4},{},5},{[,8},{],9}, };public:bool isValid(string s) {bool flagfalse;int lenss.length();if (lens % 2 ! 0){flag false;}for…