unity实现翻页按钮功能

本文实例为大家分享了unity实现翻页按钮功能的具体代码,供大家参考,具体内容如下

效果图:

UI子父级关系:

代码中也都有加入注释,有不懂可私信我。脚本中用到了对象池,我没有上传,可根据自己需求做相应变动。

脚本:PageBtnPanelC

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.UI;
/// <summary>
/// 分页按钮面板控制器
/// </summary>
public class PageBtnPanelC : MonoBehaviour {
 private HorizontalLayoutGroup self_HLG;
 /// <summary>
 /// 上一页按钮
 /// </summary>
 private Button lastPageBtn;
 /// <summary>
 /// 下一页按钮
 /// </summary>
 private Button nextPageBtn;
 /// <summary>
 /// 页数的父物体
 /// </summary>
 private RectTransform pageBtnParent;
 private HorizontalLayoutGroup pageBtnParent_HLG;
 /// <summary>
 /// 上一页按钮点击事件
 /// </summary>
 private UnityAction<int> lastPageBtnEvent;
 /// <summary>
 /// 下一页按钮点击事件
 /// </summary>
 private UnityAction<int> nextPageBtnEvent;
 /// <summary>
 /// 当前显示页面的下标
 /// </summary>
 private int _currentShowPageIndex = 1;
 public int CurrentShowPageIndex {
  get {
   return _currentShowPageIndex;
  }
  set {
   _currentShowPageIndex = value;
  }
 }
 /// <summary>
 /// 总的页面数
 /// </summary>
 private int totalPageNumber = 0;
 /// <summary>
 /// 显示按钮的个数 奇数个
 /// </summary>
 [Header("必须是奇数个,且小于总页数")]
 private int _showBtnCount = 5;
 public int ShowBtnCount {
  get {
   if (_showBtnCount > totalPageNumber) {
    _showBtnCount = totalPageNumber;
   }

   return _showBtnCount;
  }
  set {
   if (value % 2 == 0)
   {
    _showBtnCount = value - 1;
   }
   else {
    _showBtnCount = value;
   }
  }
 }
 /// <summary>
 /// 页数按钮 预设体
 /// </summary>
 public GameObject btnPrefabs;
 /// <summary>
 /// 页数按钮 存放list
 /// </summary>
 public List<PageBtnC> pbcList;

 private void Start()
 {
  Init();
  Set(14, 9, (index1) =>
  {
   Debug.Log("当前显示第:" + CurrentShowPageIndex + "页");
  }, (index2) =>
  {
   Debug.Log("当前显示第:" + CurrentShowPageIndex + "页");
  }, (_pageIndex, _pbc) =>
  {
   Debug.Log("当前显示第:" + CurrentShowPageIndex + "页");
  });
 }
 /// <summary>
 /// 改变显示的状态
 /// </summary>
 void ChangeShowState() {
  int _showBtnCount = ShowBtnCount;
  /*
   判断是否在可更新范围内,如果在更新范围内,则将CurrentShowPageIndex设置为中心位置的按钮
   eg:假设总共有10页(totalPageNumber = 10),显示按钮的个数为7(ShowBtnCount = 7)
   则应该在 (ShowBtnCount / 2 + 1) = 4 到 totalPageNumber - ShowBtnCount / 2 = 7 之间设置
   如果CurrentShowPageIndex = 5或6
   则应该这样显示  1.. 3 4 5 6 7 ..10
   如果不在更新范围内,
   如果CurrentShowPageIndex = 1或2或3或4  则应该这样显示: 1 2 3 4 5 6 ..10
   如果如果CurrentShowPageIndex = 7或8或9或10 则应该这样显示 1.. 5 6 7 8 9 10
   */
  if (CurrentShowPageIndex >= (ShowBtnCount / 2 + 1) && CurrentShowPageIndex <= (totalPageNumber - ShowBtnCount / 2))
  {
   int _showBtnCount2 = _showBtnCount - 2;
   _showBtnCount2 /= 2;

   //判断起始下标
   int startIndex = CurrentShowPageIndex - _showBtnCount2;
   int endIndex = CurrentShowPageIndex + _showBtnCount2;

   //防止超出
   if (startIndex <= 1)
   {
    startIndex = 2;
   }
   //防止超出
   if (endIndex >= totalPageNumber)
   {
    endIndex = totalPageNumber - 1;
   }

   //计算中心位置按钮的下标 因为showBtnCount不定
   int centerIndex = ShowBtnCount / 2;

   pbcList[centerIndex].Set(CurrentShowPageIndex);

   //循环设置前面一部分按钮信息
   for (int i = 1; i < centerIndex; i++)
   {
    pbcList[i].Set(startIndex++);
   }

   //循环设置后面一部分按钮信息
   for (int i = centerIndex + 1; i < ShowBtnCount - 1; i++)
   {
    startIndex++;
    pbcList[i].Set(startIndex);
   }
  }
  else {
   //如果点击的是小于等于4的按钮下标
   if (CurrentShowPageIndex < (ShowBtnCount / 2 + 1))
   {
    for (int i = 0; i < ShowBtnCount - 1; i++) {
     pbcList[i].Set(i+1);
    }
   }//如果点击的事大于等于7的按钮下标
   else if (CurrentShowPageIndex > (totalPageNumber - ShowBtnCount / 2)) {

    int startNumber = totalPageNumber - ShowBtnCount + 2;

    for (int i = 1; i < ShowBtnCount; i++) {
     pbcList[i].Set(startNumber++);
    }
   }
  }

  /*
   判断总显示页数是否大于显示页数
   以防止出现这种效果:
   例如:totalPageNumber = 7,ShowBtnCount =7
   防止出现的效果:1 2 3 4 5 6 ..7 和 1.. 2 3 4 5 6 7
   应该出现的效果:1 2 3 4 5 6 7
   */
  if (totalPageNumber > ShowBtnCount){
   _showBtnCount -= 2;
   _showBtnCount /= 2;
   if (CurrentShowPageIndex - _showBtnCount - 1 > 1)
   {
    pbcList[0].Set(1, "1..");
   }
   else
   {
    pbcList[0].Set(1);
   }
   if (CurrentShowPageIndex + _showBtnCount + 1 < totalPageNumber)
   {
    pbcList[ShowBtnCount - 1].Set(totalPageNumber, ".." + totalPageNumber);
   }
   else
   {
    pbcList[ShowBtnCount - 1].Set(totalPageNumber);
   }
  }
 }

 private bool isInit = false;
 public void Init() {
  if (isInit)
   return;
  isInit = true;

  pbcList = new List<PageBtnC>();

  self_HLG = transform.GetComponent<HorizontalLayoutGroup>();

  pageBtnParent = transform.Find("PageIndexParent") as RectTransform;
  pageBtnParent_HLG = pageBtnParent.GetComponent<HorizontalLayoutGroup>();

  lastPageBtn = transform.Find("LastPageBtn").GetComponent<Button>();
  lastPageBtn.onClick.AddListener(()=> {
   if (totalPageNumber <= 0)
    return;

   if (CurrentShowPageIndex > 1) {
    CurrentShowPageIndex--;
   }

   ResetPageBtnState();

   ChangeShowState();

   PageBtnC pbc = GetPBCFromIndex(CurrentShowPageIndex);
   if (pbc != null) {
    pbc.SetHighlightColor();
   }

   if (lastPageBtnEvent != null)
   {
    lastPageBtnEvent(CurrentShowPageIndex);
   }
  });

  nextPageBtn = transform.Find("NextPageBtn").GetComponent<Button>();
  nextPageBtn.onClick.AddListener(()=> {
   if (totalPageNumber <= 0)
    return;

   if (CurrentShowPageIndex < totalPageNumber) {
    CurrentShowPageIndex++;
   }

   ResetPageBtnState();

   ChangeShowState();

   PageBtnC pbc = GetPBCFromIndex(CurrentShowPageIndex);
   if (pbc != null)
   {
    pbc.SetHighlightColor();
   }

   if (nextPageBtnEvent != null)
   {
    nextPageBtnEvent(CurrentShowPageIndex);
   }

  });
 }
 /// <summary>
 /// 设置信息
 /// </summary>
 /// <param name="totalPageNumber">总页数</param>
 /// <param name="showBtnCount">显示多少个按钮,填奇数,如果填偶数,则会强制减1,如:填6,则实际为5</param>
 /// <param name="lastBtnEvent">上一页按钮事件</param>
 /// <param name="nextBtnEvent">下一页按钮事件</param>
 /// <param name="pageBtnClickEvent">单独点击页面按钮事件</param>
 public void Set(int totalPageNumber,int showBtnCount,UnityAction<int> lastBtnEvent,UnityAction<int> nextBtnEvent,UnityAction<int,PageBtnC> pageBtnClickEvent) {
  if (totalPageNumber <= 0)
  {
   this.totalPageNumber = 1;
  }
  else {
   this.totalPageNumber = totalPageNumber;
  }

  this.ShowBtnCount = showBtnCount;

  this.lastPageBtnEvent = lastBtnEvent;
  this.nextPageBtnEvent = nextBtnEvent;

  CurrentShowPageIndex = 1;

  pbcList.Clear();

  for (int i = 1; i <= ShowBtnCount; i++) {
   int index = i;
   PageBtnC pbc = PoolManager.Instance.Spawn(btnPrefabs, pageBtnParent).GetComponent<PageBtnC>();
   if (pbc) {
    pbc.Set(index,null, (pageIndex,pbc111) =>
    {
     CurrentShowPageIndex = pageIndex;

     ResetPageBtnState();

     ChangeShowState();

     PageBtnC pbc1 = GetPBCFromIndex(CurrentShowPageIndex);
     if (pbc1 != null)
     {
      pbc1.SetHighlightColor();
     }
     if (pageBtnClickEvent != null) {
      pageBtnClickEvent(pageIndex, pbc111);
     }
    });
   }
   pbcList.Add(pbc);
  }

  pbcList[0].SetHighlightColor();

  ChangeShowState();

  Util.SetWidth_ChildWidthSame(pageBtnParent_HLG, pageBtnParent);

  Util.SetWidth_ChildWidthNotSame(self_HLG, transform as RectTransform);
 }
 /// <summary>
 /// 重置所有按钮的状态
 /// </summary>
 void ResetPageBtnState() {
  for (int i = 0; i < pbcList.Count; i++) {
   pbcList[i].SetNormalColor();
  }
 }
 /// <summary>
 /// 回收所有页码
 /// </summary>
 public void Unspawn() {
  for (int i = pageBtnParent.childCount - 1; i >= 0; i--) {

   PoolManager.Instance.UnSpawn(pageBtnParent.GetChild(i).gameObject);
  }
 }

 public void Clear() {
  lastPageBtnEvent = null;
  nextPageBtnEvent = null;
 }
 /// <summary>
 /// 根据index得到pagebtnc物体
 /// </summary>
 /// <param name="index"></param>
 /// <returns></returns>
 PageBtnC GetPBCFromIndex(int index) {
  for (int i = 0; i < pbcList.Count; i++) {
   if (pbcList[i].CurrentPageIndex.Equals(index)) {
    return pbcList[i];
   }
  }

  return null;
 }
}

public class Util
{
 /// <summary>
 /// 设置物体宽度 子物体宽度相同
 /// </summary>
 /// <param name="parentHLG"></param>
 /// <param name="parent"></param>
 /// <param name="callback"></param>
 public static void SetWidth_ChildWidthSame(HorizontalLayoutGroup parentHLG, RectTransform parent, UnityAction<float> endCallBack = null)
 {
  float width = 0;

  float leftPadding = parentHLG.padding.left;
  float spacing = parentHLG.spacing;

  int childCount = parent.childCount;

  if (childCount > 0)
  {
   RectTransform singleChildRT = parent.GetChild(0) as RectTransform;

   width = childCount * singleChildRT.rect.width + (childCount - 1) * spacing + leftPadding;
  }

  parent.sizeDelta = new Vector2(width, parent.sizeDelta.y);

  if (endCallBack != null)
  {
   endCallBack(width);
  }
 }

 /// <summary>
 /// 设置物体宽度 子物体宽度不同
 /// </summary>
 /// <param name="parentHLG"></param>
 /// <param name="parent"></param>
 /// <param name="callback"></param>
 public static void SetWidth_ChildWidthNotSame(HorizontalLayoutGroup parentHLG, RectTransform parent, UnityAction<float> endCallBack = null)
 {
  float width = 0;

  RectOffset Padding = parentHLG.padding;
  float spacing = parentHLG.spacing;

  int childCount = parent.childCount;

  if (childCount > 0)
  {
   for (int i = 0; i < childCount; i++)
   {
    RectTransform childRT = parent.GetChild(i) as RectTransform;
    width += childRT.rect.width;
   }

   width += (childCount - 1) * spacing + Padding.left + Padding.right;
  }

  parent.sizeDelta = new Vector2(width, parent.sizeDelta.y);

  if (endCallBack != null)
  {
   endCallBack(width);
  }
 }
}

脚本:PageBtnC

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.UI;
/// <summary>
/// 页码按钮控制器
/// </summary>
public class PageBtnC : MonoBehaviour,IPool {
 /// <summary>
 /// 自己显示的页码
 /// </summary>
 private int currentPageIndex = 0;
 public int CurrentPageIndex {
  get {
   return currentPageIndex;
  }
 }

 private Button SelfBtn;
 private Image img;
 private Text selfText;

 /// <summary>
 /// 按钮事件
 /// </summary>
 public UnityAction<int,PageBtnC> btnClickEvent;

 /// <summary>
 /// 按钮正常和高亮颜色
 /// </summary>
 public Color normalColor;
 public Color highlightColor;

 /// <summary>
 /// 文本正常和高亮颜色
 /// </summary>
 public Color normalTextColor;
 public Color highlightTextColor;

 private bool isInit = false;
 void Init() {
  if (isInit)
   return;
  isInit = true;

  img = transform.GetComponent<Image>();

  selfText = transform.Find("Text").GetComponent<Text>();

  SelfBtn = transform.GetComponent<Button>();
  SelfBtn.onClick.AddListener(()=> {

   if (btnClickEvent != null) {
    btnClickEvent(currentPageIndex,this);
   }
  });
 }
 /// <summary>
 /// 设置正常颜色
 /// </summary>
 public void SetNormalColor() {
  img.color = normalColor;
  selfText.color = normalTextColor;
 }
 /// <summary>
 /// 设置高亮颜色
 /// </summary>
 public void SetHighlightColor() {
  img.color = highlightColor;
  selfText.color = highlightTextColor;
 }
 /// <summary>
 /// 设置事件 文本内容等
 /// </summary>
 /// <param name="currentPageIndex"></param>
 /// <param name="selfTextStr"></param>
 /// <param name="btnClickEvent"></param>
 public void Set(int currentPageIndex,string selfTextStr = null,UnityAction<int,PageBtnC> btnClickEvent = null) {
  this.currentPageIndex = currentPageIndex;

  if (btnClickEvent != null)
  {
   this.btnClickEvent = btnClickEvent;
  }

  if (string.IsNullOrEmpty(selfTextStr))
  {
   selfText.text = currentPageIndex.ToString();
  }
  else {
   selfText.text = selfTextStr;
  }
 }

 #region 对象池接口方法
 public int GetMaxCount()
 {
  return 10;
 }

 public string SingletonName()
 {
  return this.GetType().Name;
 }

 public void Spawn()
 {
  Init();
 }

 public void UnSpawn()
 {
  SetNormalColor();
 }
 #endregion
}

github地址

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

(0)

相关推荐

  • Unity UGUI实现滑动翻页效果

    本文实例为大家分享了Unity UGUI实现滑动翻页效果的具体代码,供大家参考,具体内容如下 这个问题真的是老生常谈的事情了,不过在这里还是要说一下,以便以后之需 首先看一下效果图 最后在Content下面是一些Image using UnityEngine; using System.Collections; using UnityEngine.UI; using System.Collections.Generic; using UnityEngine.EventSystems; using

  • Unity使用ScrollRect制作翻页

    本文实例为大家分享了使用ScrollRect制作翻页的具体代码,供大家参考,具体内容如下 1.标准的层级结构 ScrollRect->ViewPort->Content,Viewport负责显示区域的大小一般和Mask一起配合使用,Content使用Layout来布局,如果想使用代码来自动定位显示位置需要在Content加上Content size filter. 2.ScrollRectHelper using UnityEngine; using UnityEngine.UI; using

  • unity scrollRect实现按页码翻页效果

    本文实例为大家分享了unity实现按页码翻页效果的具体代码,供大家参考,具体内容如下 用来做背包 商店的按页翻页功能,先上效果图 其中,dragNum 表示的是 如果为3,便是滑动距离超过当前页面宽度的百分之三十位成功 connect表示 scrollRect下connet的大小 然后是函数的初始化方法 这里提供了两个方法  一个是直接提供页数 参数分别代表 总页数,要显示的页数 以及切换到要显示的页数是否播放滑动动画 以及当时用来做背包.商店的方法2 和上面不用的是传入的是物品的数量以及每页显

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

    本文实例为大家分享了Unity UGUI实现滑动翻页,直接跳转页数的具体代码,供大家参考,具体内容如下 首先看一下最终效果 其实这个功能基本上是老生常谈了,所以代码还是很简单 using UnityEngine; using System.Collections; using UnityEngine.UI; using System.Collections.Generic; using UnityEngine.EventSystems; using System; public class Pa

  • Unity工具类ScrollView实现拖拽滑动翻页

    简介: 在进行UI设计的时候,经常会使用Unity中UI提供的ScrollView,类似Android中的ScrollView,在进行图片预览,多个翻页的时候,能实现很好的效果. 该类中根据Unity的EventSystems中拖拽事件,实现对页码的滑动监听,在使用的时候,新建UI--->ScrollView,把该类组件添加到ScrollView上,把对应的content加入该脚本中的content,调整ScrollView和Content,设置单个滑动页的宽度,拖拽的阈值,即可监听到拖拽,如果

  • unity实现翻页按钮功能

    本文实例为大家分享了unity实现翻页按钮功能的具体代码,供大家参考,具体内容如下 效果图: UI子父级关系: 代码中也都有加入注释,有不懂可私信我.脚本中用到了对象池,我没有上传,可根据自己需求做相应变动. 脚本:PageBtnPanelC using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.Events; using UnityEngine.UI; /

  • JS模仿腾讯图片站的图片翻页按钮效果完整实例

    本文实例讲述了JS模仿腾讯图片站的图片翻页按钮效果.分享给大家供大家参考,具体如下: 运行效果截图如下: 具体代码如下: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> <html> <head> <meta http-equiv="Content-Type" conten

  • MySql实现翻页查询功能

    首先明确为什么要使用分页查询,因为数据庞大,查询不可能全部显示在页面上,如果全部显示在页面上,也会造成查询速度慢的情况,所以分页查询解决了①数据查询:②性能优化,等(其他问题欢迎补充)的问题. 分页查询也分为真分页和假分页: 真分页:基于数据库查出的数据直接分页显示,优点是改变数据库数据不会影响查询结果,缺点是速度稍慢. 假分页:将所有数据查询出的数据,封装到list集合缓存中,表现层方法调用执行.由于将数据封装为集合放入了内存中,所以速度较快,但缺点是数据库改变后,会出现不匹配的情况. 两种分

  • unity实现翻页效果

    本文实例为大家分享了unity实现翻页效果的具体代码,供大家参考,具体内容如下 一.示意图 二.步骤 创建物体ToPanel:添加组件ScrollRect, 在下面创建一个空物体用来装需要移动的子物体, 创建一个Scrollbar: 三.代码 下面展示一些 内联代码片. using UnityEngine; using System.Collections; using UnityEngine.UI; using System.Collections.Generic; public class

  • jquery+html仿翻页相册功能

    今天心情大好,再发一篇最进前端实现的相册模仿功能. 这个相册是在一个网站的案例展示页面上实现的,没单独写出来,没时间,重用性也很差,以后有时间了再单独提取出来, 写这个玩意前,我在网上找了一些案例,但是一看代码都比较傻眼,固不想去研究,所以自己写了..... 下面是实现这个功能的截图 如果你是一个前端,这个功能对你来说除了逻辑复杂点,其他的可能实现起都比较简单,我不是做前端的,所以前端HTML这块遇到了一些问题.下面我会将我遇到的这些问题的解决方法分享出来. 首先说下:postion这个属性 以

  • 实现dedecms图集单击图片翻页的功能

    1.为了实现这个功能,我们首先需要获得图片页面的当前页码和总页码 编辑include/inc_archives_view.php文件 (1)找到function ParseDMFields,修改为: function ParseDMFields($pageNo,$ismake=1)      {          $this->NowPage = $pageNo;         //获得当前页面编号          $this->Fields['cpagenum'] = $this->

  • python tkiner实现 一个小小的图片翻页功能的示例代码

    具体代码如下所示: import tkinter as tk import tkinter.messagebox import copy import os,sys def get_picture(dirs): '''获得所有图片''' picture_list = [] for dir,dir_abs,files in os.walk(dirs): for file in files: if file.endswith('.gif'): picture_list.append(os.path.

  • PHP翻页跳转功能实现方法

    我们都知道用php+mysql在web 页实现数据库资料全部显示是非常简单而有趣的,数据库资料很少的情况下页面显示还是让人满意的,但是当数据库资料非常多的情况下,页面的显示情况将会变的非常糟糕,下面就来介绍一下如何实现当前页面数据资料显示数量及如何实现动态的翻转功能. 这里将介绍两种翻页显示功能的实现: 先介绍一下在翻页中用到的数据库语法: mysql_query("select * from table order by id desc"); 这条数据库语句再熟悉不过了,是用来搜索记

  • C# winform自定义翻页控件详解

    C#  winform中自定义的翻页控件,自己设计,供大家参考,具体内容如下 1.主要是使用控件绑定点击事件   用到的控件分别为picturebox   lable  上一页pbPage_Prev    下一页 pbPage_Next  首页 pbPage_Begin   尾页pbPage_End  是picturebox控件加背景图 "第  页/ 共  页" 是一个lable "labPageInfo"    在lable上面加了一个隐藏的textbox 控件

  • 通过MySQL优化Discuz!的热帖翻页的技巧

    写在前面:discuz!作为首屈一指的社区系统,为广大站长提供了一站式网站解决方案,而且是开源的(虽然部分代码是加密的),它为这个垂直领域的行业发展作出了巨大贡献.尽管如此,discuz!系统源码中,还是或多或少有些坑.其中最著名的就是默认采用MyISAM引擎,以及基于MyISAM引擎的抢楼功能,session表采用memory引擎等,可以参考后面几篇历史文章.本次我们要说说discuz!在应对热们帖子翻页逻辑功能中的另一个问题. 在我们的环境中,使用的是 MySQL-5.6.6 版本. 在查看

随机推荐