Unity工具类ScrollView实现拖拽滑动翻页
程序员文章站
2023-11-14 15:11:34
简介:在进行ui设计的时候,经常会使用unity中ui提供的scrollview,类似android中的scrollview,在进行图片预览,多个翻页的时候,能实现很好的效果。该类中根据unity的e...
简介:
在进行ui设计的时候,经常会使用unity中ui提供的scrollview,类似android中的scrollview,在进行图片预览,多个翻页的时候,能实现很好的效果。
该类中根据unity的eventsystems中拖拽事件,实现对页码的滑动监听,在使用的时候,新建ui--->scrollview,把该类组件添加到scrollview上,把对应的content加入该脚本中的content,调整scrollview和content,设置单个滑动页的宽度,拖拽的阈值,即可监听到拖拽,如果是动态实例化scrollview中的child,需设置当前最大页码数。setcurindex可以实现直接定位到当前页码对应的滑动页,代码比较简单,直接贴出来。
public class scrollviewlistener : monobehaviour, idraghandler, ibegindraghandler, ienddraghandler { //滑动方向 public enum movedirection { none = 0, left, right, } public float singleitemwidth;//单个滑动页的宽度 public recttransform content;//当前scrollview的content public float dragminvalue = 5f;//拖动过程中允许的最小的拖拽值,低于此值就不算拖拽,不执行翻页事件 private movedirection direction = movedirection.none; private int curindex = 0;//当前页码 private int maxindex = 0;//最大页码 public bool canmove = true;//是否能移动 private vector3 originalpos; private float maxdeltax = 0f;//取整个拖动过程中的最大值 public action<int> onpagechange;//对外提供页码修改的回调 /// <summary> /// 滑到下一页 /// </summary> private void movetonext() { if (direction == movedirection.left) { if (curindex < maxindex) { curindex++; canmove = false; content.dolocalmovex(content.localposition.x - singleitemwidth, 1f).oncomplete(() => { if (null != onpagechange) { onpagechange(curindex); } canmove = true; }); } } else if (direction == movedirection.right) { if (curindex > 0) { curindex--; canmove = false; content.dolocalmovex(content.localposition.x + singleitemwidth, 1f).oncomplete(() => { if (null != onpagechange) { onpagechange(curindex); } canmove = true; }); } } } /// <summary> /// 设置当前滑动列表的页数的最大值 /// </summary> /// <param name="max"></param> public void setmaxindex(int max) { maxindex = max - 1;//最大下标值为页数减1 } /// <summary> /// 设置当前页 /// </summary> /// <param name="index"></param> public void setcurindex(int index) { curindex = index; float x = content.localposition.x - singleitemwidth * curindex; content.localposition = new vector3(x, content.localposition.y, content.localposition.z); } public void resetposition() { content.localposition = originalpos; } private void awake() { curindex = 0; originalpos = content.localposition; } public void ondrag(pointereventdata eventdata) { if (mathf.abs(eventdata.delta.x) > maxdeltax) { maxdeltax = mathf.abs(eventdata.delta.x); } } public void onbegindrag(pointereventdata eventdata) { if (eventdata.delta.x > 0) { direction = movedirection.right; } else if (eventdata.delta.x < 0) { direction = movedirection.left; } else { direction = movedirection.none; } if (mathf.abs(eventdata.delta.x) > maxdeltax) { maxdeltax = mathf.abs(eventdata.delta.x); } } public void onenddrag(pointereventdata eventdata) { if (mathf.abs(eventdata.delta.x) > maxdeltax) { maxdeltax = mathf.abs(eventdata.delta.x); } if (maxdeltax > dragminvalue) { //计算下一页的目的点 然后移动 if (canmove) { movetonext(); } } maxdeltax = 0f; } }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。