unity实现图片轮播效果_Unity3D实现列表拖拽轮播分页滚动功能
在使用UGUI的ScrollRect做列表滾動時,會有分頁滾動的需求,基于ScrollRect寫了一個,只需要一個ScrollRect組件即可
效果截圖:
Threshold為滾動閾值,當翻頁的長度達到總長度的0.2時即會翻頁,speed為松開鼠標后的緩動速度
以下為代碼:
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.EventSystems;
using System.Collections;
public class RollScroll : MonoBehaviour, IBeginDragHandler, IEndDragHandler
{
//滾動條
public ScrollRect scrollRect;
//左右按鈕
public Button leftButton, rightButton;
//滾動閾值
public float Threshold = 0.2f;
//緩動速度
public float speed = 10f;
//是否開啟拖拽滾動
private bool IsStart = false;
//總個數(shù)
private int Number;
//當前進行到的個數(shù)
private int currentNumber;
private int CurrentNumber
{
get
{
return currentNumber;
}
set
{
currentNumber = value;
//更新按鈕顯示狀態(tài)
ButtonUIUpdate();
}
}
/// /// 初始化輪播
///
/// 總頁數(shù)
/// 初始頁數(shù)
public void OnInitRollScroll(int _number, int _currentNumber)
{
if (_number <= 1) return;
//總個數(shù)
Number = _number;
//當前個數(shù)
CurrentNumber = _currentNumber;
//設(shè)置起點
StartCoroutine(HandlePosition(GetScrollPosition(CurrentNumber)));
//content = scrollRect.content;
//左按鈕點擊事件
leftButton.onClick.RemoveAllListeners();
leftButton.onClick.AddListener(OnLeft);
//右按鈕點擊事件
rightButton.onClick.RemoveAllListeners();
rightButton.onClick.AddListener(OnRight);
IsStart = true;
}
//延遲執(zhí)行設(shè)置初始化滾動起點
private IEnumerator HandlePosition(float number)
{
yield return null;
yield return null;
scrollRect.horizontalNormalizedPosition = number;
}
#region 拖拽事件
public void OnBeginDrag(PointerEventData eventData)
{
if (!IsStart) return;
StopAllCoroutines();
}
public void OnEndDrag(PointerEventData eventData)
{
if (!IsStart) return;
//Debug.Log("結(jié)束拖拽");
//滾動前的position
float lastPosition = GetScrollPosition(currentNumber);
//滾動后的position
float currentPosition = scrollRect.horizontalNormalizedPosition;
if (currentPosition > lastPosition)
{
float n = 1f / (Number - 1);
float thre = currentPosition - lastPosition;
if (thre > n * Threshold)
{
OnRight();
}
else //還原
{
StopAllCoroutines();
StartCoroutine(LerpRoll(lastPosition));
}
}
else
{
float n = 1f / (Number - 1);
float thre = lastPosition - currentPosition;
if (thre > n * Threshold)
{
OnLeft();
}
else //還原
{
StopAllCoroutines();
StartCoroutine(LerpRoll(lastPosition));
}
}
}
#endregion
#region 左右按鈕事件
//左按鈕事件
private void OnLeft()
{
if (CurrentNumber > 0)
{
CurrentNumber--;
StopAllCoroutines();
StartCoroutine(LerpRoll(GetScrollPosition(CurrentNumber)));
}
}
//右按鈕事件
private void OnRight()
{
if (CurrentNumber < Number - 1)
{
CurrentNumber++;
StopAllCoroutines();
StartCoroutine(LerpRoll(GetScrollPosition(CurrentNumber)));
}
}
#endregion
#region 功能方法
//緩動滾動到...
private IEnumerator LerpRoll(float position)
{
while (true)
{
if (Mathf.Abs(scrollRect.horizontalNormalizedPosition - position) <= 0.001f)
{
scrollRect.horizontalNormalizedPosition = position;
break;
}
else
{
scrollRect.horizontalNormalizedPosition = Mathf.Lerp(scrollRect.horizontalNormalizedPosition, position, Time.deltaTime * speed);
}
yield return null;
}
}
/// /// 獲取滾動條value 0 - 1的值
///
private float GetScrollPosition(int number)
{
float n = 1f / (Number - 1);
float scrollPosition = Mathf.Clamp(n * number, 0, 1);
//Debug.Log(scrollPosition);
return scrollPosition;
}
//按鈕更新顯示狀態(tài)
private void ButtonUIUpdate()
{
if (Number == 1)
{
leftButton.interactable = false;
rightButton.interactable = false;
return;
}
if (currentNumber == 0)
{
leftButton.interactable = false;
rightButton.interactable = true;
}
else if (currentNumber == Number - 1)
{
leftButton.interactable = true;
rightButton.interactable = false;
}
else
{
leftButton.interactable = true;
rightButton.interactable = true;
}
}
#endregion
}
總結(jié)
以上是生活随笔為你收集整理的unity实现图片轮播效果_Unity3D实现列表拖拽轮播分页滚动功能的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mchain r语言_【揭秘】Mchai
- 下一篇: IntelliJ IDEA 对于gene