Unity UGUI實現(xiàn)滑動翻頁效果

參考連接:https://blog.csdn.net/weixin_41814169/article/details/88890650

今天做一個滑動翻頁效果良蛮,便用上面連接的輪子做滑動翻頁效果苍柏,但是這個滑動翻頁效果只支持滑動千劈,不支持設(shè)置index之后滑動過去鳞尔,故做了修改以支持idnex滑動翻頁效果~
順便記錄一下~

注意:

SetIndexMove(int index) 這個方法便是設(shè)置index滑動

using UnityEngine;
using System.Collections;
using UnityEngine.UI;
using System.Collections.Generic;
using UnityEngine.EventSystems;
using System;
    public class PageView : MonoBehaviour, IBeginDragHandler, IEndDragHandler
    {
        ScrollRect rect;                        //滑動組件  
                                                //public ScrollRect rect2;                        //滑動組件2  

        private float targethorizontal = 0;             //滑動的起始坐標  
        private bool isDrag = false;                    //是否拖拽結(jié)束  
        private List<float> posList = new List<float>();//求出每頁的臨界角,頁索引從0開始  
        private int currentPageIndex = -1;
        public Action<int> OnPageChanged;

        private bool stopMove = true;
        public float smooting = 4;      //滑動速度  
        public float sensitivity = 0;
        private float startTime;

        private float startDragHorizontal;

        bool isInit = false;
        public void Init()
        {
            // rect = rect2;
            rect = transform.GetComponent<ScrollRect>();
            // rect2 = transform.GetComponent<ScrollRect>();
            float horizontalLength = rect.content.rect.width - GetComponent<RectTransform>().rect.width;
            //float horizontalLength2 = rect2.content.rect.width - GetComponent<RectTransform>().rect.width;
            posList.Add(0);
            for (int i = 1; i < rect.content.transform.childCount - 1; i++)
            {
                posList.Add(GetComponent<RectTransform>().rect.width * i / horizontalLength);
            }
            posList.Add(1);
            isInit = true;
        }

        void Update()
        {
            if (isInit)
            {
                if (!isDrag && !stopMove)
                {
                    startTime += Time.deltaTime;
                    float t = startTime * smooting;
                    rect.horizontalNormalizedPosition = Mathf.Lerp(rect.horizontalNormalizedPosition, targethorizontal, t);
                    // rect2.horizontalNormalizedPosition = Mathf.Lerp(rect2.horizontalNormalizedPosition, targethorizontal, t);
                    if (t >= 1)
                        stopMove = true;
                }
            }
        }

        public void pageTo(int index)
        {
            if (!isInit) return;
            if (index >= 0 && index < posList.Count)
            {
                rect.horizontalNormalizedPosition = posList[index];
                SetPageIndex(index);
            }
            else
            {
                Debug.LogWarning("頁碼不存在");
            }
        }
        private void SetPageIndex(int index)
        {
            if (!isInit) return;
            if (currentPageIndex != index)
            {
                currentPageIndex = index;
                if (OnPageChanged != null)
                    OnPageChanged(index);
            }
        }

        public void OnBeginDrag(PointerEventData eventData)
        {
            if (!isInit) return;
            isDrag = true;
            startDragHorizontal = rect.horizontalNormalizedPosition;
            // startDragHorizontal = rect2.horizontalNormalizedPosition;
        }

        public void OnEndDrag(PointerEventData eventData)
        {
            if (!isInit) return;
            float posX = rect.horizontalNormalizedPosition;
            posX += ((posX - startDragHorizontal) * sensitivity);
            posX = posX < 1 ? posX : 1;
            posX = posX > 0 ? posX : 0;
            int index = 0;
            float offset = Mathf.Abs(posList[index] - posX);
            for (int i = 1; i < posList.Count; i++)
            {
                float temp = Mathf.Abs(posList[i] - posX);
                if (temp < offset)
                {
                    index = i;
                    offset = temp;
                }
            }
            SetPageIndex(index);

            targethorizontal = posList[index]; //設(shè)置當前坐標,更新函數(shù)進行插值  
            isDrag = false;
            startTime = 0;
            stopMove = false;
        }

        public void SetIndexMove(int index)
        {
            if (index < 0)
            {
                index = index < 0 ? posList.Count - 1 : index;
            }
            else if (index >= posList.Count)
            {
                index = index >= posList.Count ? 0 : index;
            }

            SetPageIndex(index);
            targethorizontal = posList[index]; //設(shè)置當前坐標,更新函數(shù)進行插值

            startTime = 0;
            stopMove = false;
        }
    }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市父阻,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖加矛,帶你破解...
    沈念sama閱讀 211,496評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件钠署,死亡現(xiàn)場離奇詭異,居然都是意外死亡荒椭,警方通過查閱死者的電腦和手機谐鼎,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,187評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來趣惠,“玉大人狸棍,你說我怎么就攤上這事∥肚模” “怎么了草戈?”我有些...
    開封第一講書人閱讀 157,091評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長侍瑟。 經(jīng)常有香客問我唐片,道長,這世上最難降的妖魔是什么涨颜? 我笑而不...
    開封第一講書人閱讀 56,458評論 1 283
  • 正文 為了忘掉前任费韭,我火速辦了婚禮,結(jié)果婚禮上庭瑰,老公的妹妹穿的比我還像新娘星持。我一直安慰自己,他們只是感情好弹灭,可當我...
    茶點故事閱讀 65,542評論 6 385
  • 文/花漫 我一把揭開白布督暂。 她就那樣靜靜地躺著,像睡著了一般穷吮。 火紅的嫁衣襯著肌膚如雪逻翁。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,802評論 1 290
  • 那天捡鱼,我揣著相機與錄音八回,去河邊找鬼。 笑死堰汉,一個胖子當著我的面吹牛辽社,可吹牛的內(nèi)容都是我干的伟墙。 我是一名探鬼主播翘鸭,決...
    沈念sama閱讀 38,945評論 3 407
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼戳葵!你這毒婦竟也來了就乓?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,709評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎生蚁,沒想到半個月后噩翠,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,158評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡邦投,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,502評論 2 327
  • 正文 我和宋清朗相戀三年伤锚,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片志衣。...
    茶點故事閱讀 38,637評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡屯援,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出念脯,到底是詐尸還是另有隱情狞洋,我是刑警寧澤,帶...
    沈念sama閱讀 34,300評論 4 329
  • 正文 年R本政府宣布绿店,位于F島的核電站吉懊,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏假勿。R本人自食惡果不足惜借嗽,卻給世界環(huán)境...
    茶點故事閱讀 39,911評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望转培。 院中可真熱鬧淹魄,春花似錦、人聲如沸堡距。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,744評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽羽戒。三九已至缤沦,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間易稠,已是汗流浹背缸废。 一陣腳步聲響...
    開封第一講書人閱讀 31,982評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留驶社,地道東北人企量。 一個月前我還...
    沈念sama閱讀 46,344評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像亡电,于是被迫代替她去往敵國和親届巩。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,500評論 2 348

推薦閱讀更多精彩內(nèi)容