服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C# - Unity UGUI实现滑动翻页直接跳转页数

Unity UGUI实现滑动翻页直接跳转页数

2022-09-03 14:25Unity_阿黄 C#

这篇文章主要为大家详细介绍了Unity UGUI实现滑动翻页,直接跳转页数,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文实例为大家分享了Unity UGUI实现滑动翻页,直接跳转页数的具体代码,供大家参考,具体内容如下

首先看一下最终效果

Unity UGUI实现滑动翻页直接跳转页数

Unity UGUI实现滑动翻页直接跳转页数

其实这个功能基本上是老生常谈了,所以代码还是很简单

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
using UnityEngine;
using System.Collections;
using UnityEngine.UI;
using System.Collections.Generic;
using UnityEngine.EventSystems;
using System;
 
public class PageView : MonoBehaviour, IBeginDragHandler, IEndDragHandler
{
 
 private ScrollRect rect;      //滑动组件
 private float targethorizontal = 0;    //滑动的起始坐标
 private bool isDrag = false;     //是否拖拽结束
 private List<float> posList = new List<float>();   //求出每页的临界角,页索引从0开始
 private int currentPageIndex = -1;
 public Action<int> OnPageChanged;
 public RectTransform content;
 private bool stopMove = true;
 public float smooting = 4;  //滑动速度
 public float sensitivity = 0;
 private float startTime;
 
 private float startDragHorizontal;
 public Transform toggleList;
 
 void Start()
 {
  rect = transform.GetComponent<ScrollRect>();
  var _rectWidth = GetComponent<RectTransform>();
  var tempWidth = ((float)content.transform.childCount * _rectWidth.rect.width);
  content.sizeDelta = new Vector2(tempWidth, _rectWidth.rect.height);
  //未显示的长度
  float horizontalLength = content.rect.width - _rectWidth.rect.width;
  for (int i = 0; i < rect.content.transform.childCount; i++)
  {
   posList.Add(_rectWidth.rect.width * i / horizontalLength);
  }
 }
 
 void Update()
 {
  if (!isDrag && !stopMove)
  {
   startTime += Time.deltaTime;
   float t = startTime * smooting;
   rect.horizontalNormalizedPosition = Mathf.Lerp(rect.horizontalNormalizedPosition, targethorizontal, t);
   if (t >= 1)
    stopMove = true;
  }
  //Debug.Log(rect.horizontalNormalizedPosition);
 }
 
 public void pageTo(int index)
 {
  if (index >= 0 && index < posList.Count)
  {
   rect.horizontalNormalizedPosition = posList[index];
   SetPageIndex(index);
   GetIndex(index);
  }
 }
 private void SetPageIndex(int index)
 {
  if (currentPageIndex != index)
  {
   currentPageIndex = index;
   if (OnPageChanged != null)
    OnPageChanged(index);
  }
 }
 
 public void OnBeginDrag(PointerEventData eventData)
 {
  isDrag = true;
  //开始拖动
  startDragHorizontal = rect.horizontalNormalizedPosition;
 }
 
 public void OnEndDrag(PointerEventData eventData)
 {
  float posX = rect.horizontalNormalizedPosition;
  posX += ((posX - startDragHorizontal) * sensitivity);
  posX = posX < 1 ? posX : 1;
  posX = posX > 0 ? posX : 0;
  int index = 0;
 
  float offset = Mathf.Abs(posList[index] - posX);
  //Debug.Log("offset " + offset);
 
 
  for (int i = 1; i < posList.Count; i++)
  {
   float temp = Mathf.Abs(posList[i] - posX);
   //Debug.Log("temp " + temp);
   //Debug.Log("i" + i);
   if (temp < offset)
   {
    index = i;
    offset = temp;
   }
   //Debug.Log("index " + index);
  }
  //Debug.Log(index);
  SetPageIndex(index);
  GetIndex(index);
  targethorizontal = posList[index]; //设置当前坐标,更新函数进行插值
  isDrag = false;
  startTime = 0;
  stopMove = false;
 
 }
 
 public void GetIndex(int index)
 {
  var toogle = toggleList.GetChild(index).GetComponent<Toggle>();
  toogle.isOn = true;
 }
}
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
using UnityEngine;
using System.Collections;
using UnityEngine.UI;
using System;
 
public class GameController : MonoBehaviour {
 [SerializeField]
 private Text pageNumber;
 [SerializeField]
 private InputField inputField;
 [SerializeField]
 private PageView pageView;
 // Use this for initialization
 void Start () {
  pageNumber.text = string.Format ("当前页码:0");
  pageView.OnPageChanged = pageChanged;
 }
 
 void pageChanged (int index) {
  pageNumber.text = string.Format ("当前页码:{0}" , index.ToString ());
 }
 
 public void onClick () {
  try {
   int idnex = int.Parse (inputField.text);
   pageView.pageTo (idnex);
  } catch(Exception ex) {
   Debug.LogWarning ("请输入数字"+ex.ToString());
  }
 }
 
 void Destroy () {
  pageView.OnPageChanged = null;
 }
}

附上项目:地址

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。

原文链接:https://blog.csdn.net/ldy597321444/article/details/78520876

延伸 · 阅读

精彩推荐
  • C#C#实现程序单例日志输出功能

    C#实现程序单例日志输出功能

    这篇文章主要为大家详细介绍了C#实现程序单例日志输出功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    云梦鸿11322022-01-19
  • C#C#内插字符串的简单使用

    C#内插字符串的简单使用

    这篇文章主要为大家详细介绍了C#内插字符串的使用方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    在代码的世界里游走9142022-03-05
  • C#C#实现的Excel文件操作类实例

    C#实现的Excel文件操作类实例

    这篇文章主要介绍了C#实现的Excel文件操作类,结合具体实例形式分析了C#数据库及Excel文件相关操作技巧,需要的朋友可以参考下...

    songkexin4082022-01-11
  • C#Unity3D动态生成平面网格

    Unity3D动态生成平面网格

    这篇文章主要为大家详细介绍了Unity3D动态生成平面网格,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    星空不语10742022-03-10
  • C#学习Winform文本类控件(Label、Button、TextBox)

    学习Winform文本类控件(Label、Button、TextBox)

    这篇文章主要和大家一起学习Winform文本类控件,包含标签控件(Label),按钮控件(Button),文本框控件(TextBox)和格式文本控件(RichTextBox),感兴趣的小伙伴们可...

    丿木呈广予口贝9882021-11-22
  • C#C#中的事务用法实例分析

    C#中的事务用法实例分析

    这篇文章主要介绍了C#中的事务用法,以一个简单实例形式分析了C#创建及使用事物的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下...

    yenange12272021-10-27
  • C#C#正则表达式转义字符介绍

    C#正则表达式转义字符介绍

    正则表达式,又称正规表示法、常规表示法。这篇文章主要介绍了C#正则表达式转义字符介绍的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参...

    27780850016562021-12-01
  • C#在winform下实现左右布局多窗口界面的方法

    在winform下实现左右布局多窗口界面的方法

    在web页面上我们可以通过frameset,iframe嵌套框架很容易实现各种导航+内容的布局界面,而在winform、WPF中实现其实也很容易,通过本文给大家介绍在winform下实...

    梦在旅途5562021-11-14