Unity工具类ScrollView实现拖拽滑动翻页
简介:
在进行UI设计的时候,经常会使用Unity中UI提供的ScrollView,类似Android中的ScrollView,在进行图片预览,多个翻页的时候,能实现很好的效果。
该类中根据Unity的EventSystems中拖拽事件,实现对页码的滑动监听,在使用的时候,新建UI--->ScrollView,把该类组件添加到ScrollView上,把对应的content加入该脚本中的content,调整ScrollView和Content,设置单个滑动页的宽度,拖拽的阈值,即可监听到拖拽,如果是动态实例化ScrollView中的child,需设置当前最大页码数。SetCurIndex可以实现直接定位到当前页码对应的滑动页,代码比较简单,直接贴出来。
publicclassScrollViewListener:MonoBehaviour,IDragHandler,IBeginDragHandler,IEndDragHandler
{
//滑动方向
publicenumMoveDirection
{
None=0,
Left,
Right,
}
publicfloatSingleItemWidth;//单个滑动页的宽度
publicRectTransformcontent;//当前ScrollView的Content
publicfloatDragMinValue=5f;//拖动过程中允许的最小的拖拽值,低于此值就不算拖拽,不执行翻页事件
privateMoveDirectiondirection=MoveDirection.None;
privateintCurIndex=0;//当前页码
privateintMaxIndex=0;//最大页码
publicboolcanMove=true;//是否能移动
privateVector3originalPos;
privatefloatmaxDeltaX=0f;//取整个拖动过程中的最大值
publicActionOnPageChange;//对外提供页码修改的回调
///
///滑到下一页
///
privatevoidMoveToNext()
{
if(direction==MoveDirection.Left)
{
if(CurIndex
{
if(null!=OnPageChange)
{
OnPageChange(CurIndex);
}
canMove=true;
});
}
}
elseif(direction==MoveDirection.Right)
{
if(CurIndex>0)
{
CurIndex--;
canMove=false;
content.DOLocalMoveX(content.localPosition.x+SingleItemWidth,1f).OnComplete(()=>
{
if(null!=OnPageChange)
{
OnPageChange(CurIndex);
}
canMove=true;
});
}
}
}
///
///设置当前滑动列表的页数的最大值
///
///
publicvoidSetMaxIndex(intmax)
{
MaxIndex=max-1;//最大下标值为页数减1
}
///
///设置当前页
///
///
publicvoidSetCurIndex(intindex)
{
CurIndex=index;
floatx=content.localPosition.x-SingleItemWidth*CurIndex;
content.localPosition=newVector3(x,content.localPosition.y,content.localPosition.z);
}
publicvoidResetPosition()
{
content.localPosition=originalPos;
}
privatevoidAwake()
{
CurIndex=0;
originalPos=content.localPosition;
}
publicvoidOnDrag(PointerEventDataeventData)
{
if(Mathf.Abs(eventData.delta.x)>maxDeltaX)
{
maxDeltaX=Mathf.Abs(eventData.delta.x);
}
}
publicvoidOnBeginDrag(PointerEventDataeventData)
{
if(eventData.delta.x>0)
{
direction=MoveDirection.Right;
}
elseif(eventData.delta.x<0)
{
direction=MoveDirection.Left;
}
else
{
direction=MoveDirection.None;
}
if(Mathf.Abs(eventData.delta.x)>maxDeltaX)
{
maxDeltaX=Mathf.Abs(eventData.delta.x);
}
}
publicvoidOnEndDrag(PointerEventDataeventData)
{
if(Mathf.Abs(eventData.delta.x)>maxDeltaX)
{
maxDeltaX=Mathf.Abs(eventData.delta.x);
}
if(maxDeltaX>DragMinValue)
{
//计算下一页的目的点然后移动
if(canMove)
{
MoveToNext();
}
}
maxDeltaX=0f;
}
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。