UGUI轮播图组件实现方法详解

  

本文实例为大家分享了UGUI轮播图组件实现的具体代码,供大家参考,具体内容如下

  

要用的到,于是就自已做了一个,自认为封装上还是OK的,开发于unity5.1.2。

  

支持自动轮播,手势切换,代码调用切换,支持水平和竖直两个方向以及正负方向轮播,轮播索引改变有回调可以用,也可以获取到当前处于正中的子元素。

  

要注意的是,向轮播列表中加入新元素不能直接setparent,要调用该组件的AddChild方法

  

下面是鄙人的代码:

     ///主要关注属性,事件及函数:///公共int CurrentIndex;///公共Action祝辞& lt;/param>   公共虚拟空白AddChild (RectTransform t) {   如果(t !=null) {   t。SetParent (viewRectTran假);   t.SetAsLastSibling ();   Vector2三角洲;   如果(MoveAxis==Axis.Horizontal) {   δ=new Vector2 (CellSize。x +间距。x, 0);   }   其他{   δ=new Vector2 (0, CellSize。y + Spacing.y);   }   如果(CellCount==0) {   t。localPosition=Vector3.zero;   头=t;   }   其他{   t。localPosition=δ+ (Vector2) GetChild (viewRectTran CellCount-1) .localPosition;   }   }   }   保护覆盖void> & lt;/param>   公共虚拟空白MoveToIndex (int印第安纳州){   如果(m_IsNormalizing) {   返回;   }//Debug.LogFormat (“{0}: {1},”, m_index,印第安纳州);   如果(印第安纳州==m_index) {   返回;   }   这一点。m_IsNormalizing=true;   Vector2抵消;   如果(MoveAxis==Axis.Horizontal) {   抵消=new Vector2 (CellSize。x +间距。x, 0);   }   其他{   抵消=new Vector2 (0, CellSize。y + Spacing.y);   }   varδ=CalcCorrectDeltaPos ();   int vindex=m_index;   m_CurrentPos=δ+抵消*(印第安纳- vindex);//m_CurrentPos=- (Vector2)头。localPosition +抵消*(印第安纳- m_index);   m_currentStep=0;   }   私人Vector2 CalculateOffset (Vector2δ){   如果(MoveAxis==Axis.Horizontal) {   三角洲。y=0;   }   其他{   三角洲。x=0;   }   返回三角洲;   }   私人空间SetContentPosition (Vector2位置){   foreach(我在viewRectTran RectTransform) {   我。localPosition +=(Vector3)位置;   }   返回;   }      公共虚拟void> & lt;/param>   保护虚拟空间LoopCell (int dir) {   如果(dir==0) {   返回;   }   RectTransform MoveCell;   RectTransform Tarborder;   Vector2 TarPos;   如果(dir==1) {   MoveCell=GetChild (viewRectTran, 0);   Tarborder=GetChild (viewRectTran CellCount - 1);   MoveCell.SetSiblingIndex (CellCount-1);   }   其他{   Tarborder=GetChild (viewRectTran, 0);   MoveCell=GetChild (viewRectTran CellCount - 1);   MoveCell.SetSiblingIndex (0);   }   如果(MoveAxis==Axis.Horizontal) {   TarPos=Tarborder。localPosition +新Vector3 ((CellSize。x + Spacing.x) * dir, 0, 0);   }   其他{   Tarborder TarPos=(Vector2)。localPosition +新Vector2 (0, (CellSize。y + Spacing.y) * dir);   }   MoveCell。localPosition=TarPos;   }///& lt; summary>///计算一个最近的正确位置///& lt;/summary>///& lt; returns> & lt;/returns>   公共虚拟Vector2 CalcCorrectDeltaPos () {   Vector2δ=Vector2.zero;   浮动距离=float.MaxValue;   foreach(我在viewRectTran RectTransform) {   var td=Mathf.Abs (i.localPosition.x) + Mathf.Abs (i.localPosition.y);   如果(td<=距离){   距离=td;   δ=i.localPosition;   }   其他{   打破;   }   }   返回三角洲;   }///& lt; summary>///移动指定增量///& lt;/summary>   保护虚拟空间TweenToCorrect (Vector2δ){   foreach(我在viewRectTran RectTransform) {   我。localPosition +=(Vector3)三角洲;   }   }   公共enum轴{   水平的,   垂直   }   私有静态RectTransform GetChild (RectTransform家长,int指数){   如果(父==null | | index>=parent.childCount) {   返回null;   }   作为RectTransform返回parent.GetChild(指数);   }   }      之前      

用法和ugui的scrollrect组件是差不多的,因为本来在拖事件上有所借鉴
  例图如下:

  

 UGUI轮播图组件实现方法详解

  

另外,它不会像ugui的几个布局组件一样自动去改变子元素的大小为cellsize, cellsize只是虚拟的子元素容器大小,这个要注意下。
  

  

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

UGUI轮播图组件实现方法详解