Unity使用ScrollRect制作翻页

作者:非法关键字 时间:2023-05-22 09:10:44 

本文实例为大家分享了使用ScrollRect制作翻页的具体代码,供大家参考,具体内容如下

1.标准的层级结构 ScrollRect->ViewPort->Content,Viewport负责显示区域的大小一般和Mask一起配合使用,Content使用Layout来布局,如果想使用代码来自动定位显示位置需要在Content加上Content size filter.

2.ScrollRectHelper


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

public class ScrollRectHelper : MonoBehaviour, IBeginDragHandler, IEndDragHandler
{
 // 滑动速度
 public float smooting = 5;

// 每页显示的项目
 [SerializeField]
 private int countPerPage = 10;

ScrollRect srect;
 // 总页数
 float totalPages;
 // 是否拖拽结束
 bool isDrag = false;
 // 总页数索引比列 0-1
 List<float> listPageValue = new List<float> { 0 };
 // 滑动的目标位置
 public float targetPos = 0;
 // 当前位置索引
 float nowindex = 0;                

void Awake()
 {
   srect = GetComponent<ScrollRect>();
 }

public string PageText()
 {
   return (nowindex + 1) + "/" + (totalPages + 1);
 }

// 计算每页比例
 public void CalcListPageValue<T>() where T : MonoBehaviour
 {
   T[] items = srect.content.GetComponentsInChildren<T>();
   srect.content.rect.Set(srect.content.rect.width / 2, srect.content.rect.y, srect.content.rect.width, srect.content.rect.height);
   totalPages = (int)(Math.Ceiling((float)items.Length / countPerPage) - 1);
   if (items.Length != 0)
   {
     for (float i = 1; i <= totalPages; i++)
     {
       //Debug.Log(i / totalPages);
       listPageValue.Add((i / totalPages));
     }
   }
 }

void Update()
 {
   if (!isDrag)
   {
     srect.horizontalNormalizedPosition = Mathf.Lerp(srect.horizontalNormalizedPosition, targetPos,
       Time.deltaTime * smooting);
   }

// Debug
   if (Input.GetKeyDown(KeyCode.LeftArrow)) PressLeft();
   if (Input.GetKeyDown(KeyCode.RightArrow)) PressRight();
 }

/// <summary>
 /// 拖动开始
 /// </summary>
 /// <param name="eventData"></param>
 public void OnBeginDrag(PointerEventData eventData)
 {
   isDrag = true;
 }

/// <summary>
 /// 拖拽结束
 /// </summary>
 /// <param name="eventData"></param>
 public void OnEndDrag(PointerEventData eventData)
 {
   isDrag = false;
   var tempPos = srect.horizontalNormalizedPosition; //获取拖动的值
   var index = 0;
   float offset = Mathf.Abs(listPageValue[index] - tempPos);  //拖动的绝对值
   for (int i = 1; i < listPageValue.Count; i++)
   {
     float temp = Mathf.Abs(tempPos - listPageValue[i]);
     if (temp < offset)
     {
       index = i;
       offset = temp;
     }
   }
   targetPos = listPageValue[index];
   nowindex = index;
 }

public void PressLeft()
 {
   nowindex = Mathf.Clamp(nowindex - 1, 0, totalPages);
   targetPos = listPageValue[Convert.ToInt32(nowindex)];
 }

public void PressRight()
 {
   nowindex = Mathf.Clamp(nowindex + 1, 0, totalPages);
   targetPos = listPageValue[Convert.ToInt32(nowindex)];
 }
}

来源:https://www.cnblogs.com/linxmouse/p/10239098.html

标签:unity,scrollrect,翻页
0
投稿

猜你喜欢

  • 汉字转拼音缩写示例代码(Silverlight和.NET 将汉字转换成为拼音)

    2023-01-18 10:29:45
  • Mybatis Plus select 实现只查询部分字段

    2022-07-23 18:51:32
  • c#根据网址抓取网页截屏生成图片的示例

    2021-08-31 14:29:13
  • java格式化数值成货币格式示例

    2023-01-31 06:27:45
  • java实现上传网络图片到微信临时素材

    2022-09-21 08:43:23
  • java贪吃蛇游戏编写代码

    2023-06-16 02:41:10
  • spring boot如何加入mail邮件支持

    2021-09-27 15:12:57
  • 详解Android TextView属性ellipsize多行失效的解决思路

    2022-03-02 16:00:32
  • Java最长公共子序列示例源码

    2023-08-20 13:25:37
  • C#计算程序执行过程花费时间的方法

    2022-08-07 08:44:53
  • SpringBoot配置 Druid 三种方式(包括纯配置文件配置)

    2021-06-03 01:41:19
  • Android实现左右摆动的球体动画效果

    2023-08-31 02:28:45
  • Android基于OpenCV实现Harris角点检测

    2023-07-16 12:19:47
  • 详解Flutter中视频播放器插件的使用教程

    2023-06-15 23:47:31
  • 解决Springboot @Autowired 无法注入问题

    2022-04-14 21:19:01
  • java为什么不建议用equals判断对象相等

    2022-07-14 17:17:39
  • 详解Android开发中Activity的四种launchMode

    2023-05-19 08:30:27
  • Java标识接口的使用方法

    2021-12-24 02:54:14
  • Android实现界面内嵌多种卡片视图(ViewPager、RadioGroup)

    2023-03-06 15:48:31
  • java打jar包的几种方式详解

    2021-09-27 08:43:59
  • asp之家 软件编程 m.aspxhome.com