本文实例为大家分享了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的几个布局组件一样自动去改变子元素的大小为cellsize, cellsize只是虚拟的子元素容器大小,这个要注意下。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
UGUI轮播图组件实现方法详解