最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Unity ScrollView實(shí)現(xiàn)自動(dòng)吸附效果

 更新時(shí)間:2021年07月27日 11:20:26   作者:Hello Bug.  
這篇文章主要為大家詳細(xì)介紹了Unity ScrollView實(shí)現(xiàn)自動(dòng)吸附效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

本文實(shí)例為大家分享了Unity ScrollView實(shí)現(xiàn)自動(dòng)吸附效果的具體代碼,供大家參考,具體內(nèi)容如下

一、效果演示

二、實(shí)現(xiàn)思路

通過(guò)使用UGUI的拖拽接口,在拖拽結(jié)束時(shí)比較當(dāng)前滑動(dòng)框的NormalizedPositon與每一頁(yè)的NormalizedPositon值,找到距離當(dāng)前拖拽結(jié)束位置最近的頁(yè)并緩慢滑動(dòng)過(guò)去

三、使用說(shuō)明

——此功能腳本是對(duì)ScrollView的擴(kuò)展,所以必須添加UGUI提供的基礎(chǔ)Scroll View
——Content上必須添加GridLayoutGroup組件并添加所有列表中的項(xiàng)(不是動(dòng)態(tài)添加),只是為了方便滿(mǎn)足布局需求(我在代碼中對(duì)startCorner、startAxis、childAlignment和constraintCount進(jìn)行了限制,不需要對(duì)其設(shè)置)
——不能添加Content Size Fitter組件
——測(cè)試出適合的視為滑動(dòng)一頁(yè)的距離和視為滑動(dòng)多頁(yè)的距離數(shù)值并填入即可

四、完整代碼

將AutoAdsorbScrollView腳本掛載到ScrollView上

using UnityEngine;
using UnityEngine.UI;
using UnityEngine.EventSystems;
 
/// <summary>
/// 自動(dòng)吸附的滑動(dòng)列表
/// </summary>
public class AutoAdsorbScrollView : MonoBehaviour, IBeginDragHandler, IEndDragHandler
{
    private ScrollRect scrollRect;//滑動(dòng)框組件
    private RectTransform content;//滑動(dòng)框的Content
    private GridLayoutGroup layout;//布局組件
 
    private int totalPage; //總頁(yè)數(shù)
    private int curPage; //當(dāng)前頁(yè)的下標(biāo)
    private float[] eachPageNUPos; //每頁(yè)的NormalizedPositon的值
    private float targetNUPos; //目標(biāo)頁(yè)的NormalizedPositon的值
 
    private Vector2 beginMousePos; //鼠標(biāo)開(kāi)始按下的位置
    private Vector2 endMousePos; //鼠標(biāo)結(jié)束按下的位置
    private bool isDrag; //是否在拖拽
 
    [Header("是否可以滑動(dòng)多頁(yè)")]
    public bool sliderMultPage;
 
    [Header("視為滑動(dòng)一頁(yè)的距離")]
    [Space(25)]
    public float sliderOnePageDis;
    [Header("視為滑動(dòng)多頁(yè)的距離")]
    public float sliderMultPageDis;
    [Header("緩動(dòng)到目標(biāo)頁(yè)的持續(xù)時(shí)間")]
    public float duration;
 
    #region Init
 
    private void Awake()
    {
        scrollRect = GetComponent<ScrollRect>();
        content = scrollRect.content;
        layout = content.GetComponent<GridLayoutGroup>();
 
        Init();//初始化
    }
 
    /// <summary>
    /// 初始化
    /// </summary>
    private void Init()
    {
        totalPage = content.childCount;
 
        SetContentSize();//設(shè)置Content大小
 
        CalcEachPageNUPos();//計(jì)算每一頁(yè)的NormalizedPositon值
 
        SetLayout();//設(shè)置布局
    }
 
    /// <summary>
    /// 設(shè)置Content大小
    /// </summary>
    private void SetContentSize()
    {
        content.sizeDelta = new Vector2
            (
                layout.padding.right + layout.padding.left + (totalPage - 1) * (layout.cellSize.x + layout.spacing.x) - layout.spacing.x,
                content.sizeDelta.y
            ); ;
    }
 
    /// <summary>
    /// 計(jì)算每一頁(yè)的NormalizedPositon值
    /// </summary>
    private void CalcEachPageNUPos()
    {
        float tempNUPos = 0;
        eachPageNUPos = new float[totalPage];
        for (int i = 0; i < totalPage; i++)
        {
            eachPageNUPos[i] = tempNUPos;
            tempNUPos += 1f / (totalPage - 1);
        }
    }
 
    /// <summary>
    /// 設(shè)置布局
    /// </summary>
    private void SetLayout()
    {
        scrollRect.horizontal = true;
        scrollRect.vertical = false;
        layout.padding.right = layout.padding.left;
        layout.startCorner = GridLayoutGroup.Corner.UpperLeft;
        layout.childAlignment = TextAnchor.MiddleCenter;
        layout.constraintCount = 1;
    }
 
    #endregion
 
    #region Main
 
    /// <summary>
    /// 拖拽開(kāi)始
    /// </summary>
    public void OnBeginDrag(PointerEventData eventData)
    {
        isDrag = true;
        beginMousePos = Input.mousePosition;
    }
 
    /// <summary>
    /// 拖拽結(jié)束
    /// </summary>
    /// <param name="eventData"></param>
    public void OnEndDrag(PointerEventData eventData)
    {
        isDrag = false;
        coe = 0;
 
        endMousePos = Input.mousePosition;
        Vector2 offset = endMousePos - beginMousePos;
        Debug.Log("滑動(dòng)距離為:" + offset);
 
        if (sliderMultPage)
        {
            //單頁(yè)滑動(dòng)
            if (Mathf.Abs(offset.x) >= sliderOnePageDis && Mathf.Abs(offset.x) < sliderMultPageDis)
            {
                float tempHorizontalNUPos = scrollRect.horizontalNormalizedPosition;
                FindNearlyPage(tempHorizontalNUPos);
            }
            //多頁(yè)滑動(dòng)
            else if (Mathf.Abs(offset.x) >= sliderMultPageDis)
            {
                if (offset.x > 0)
                {
                    curPage = 0;
                }
                else if (offset.x < 0)
                {
                    curPage = totalPage - 1;
                }
            }
        }
        else
        {
            //單頁(yè)滑動(dòng)
            if (Mathf.Abs(offset.x) >= sliderOnePageDis)
            {
                float tempHorizontalNUPos = scrollRect.horizontalNormalizedPosition;
                FindNearlyPage(tempHorizontalNUPos);
            }
        }
 
        targetNUPos = eachPageNUPos[curPage];
    }
 
    private float coe;//比例系數(shù)
    private void Update()
    {
        if (isDrag)
        {
            return;
        }
        coe += Time.deltaTime / duration;
        scrollRect.horizontalNormalizedPosition = Mathf.Lerp(scrollRect.horizontalNormalizedPosition, targetNUPos, coe);
    }
 
    #endregion
 
    #region Tool
 
    /// <summary>
    /// 尋找距離當(dāng)前NormalizedPositon最近的頁(yè)
    /// </summary>
    private void FindNearlyPage(float tempHorizontalNUPos)
    {
        float minOffset = Mathf.Abs(eachPageNUPos[0] - tempHorizontalNUPos);
        for (int i = 0; i < totalPage; i++)
        {
            float tempHorizontalOffset = Mathf.Abs(eachPageNUPos[i] - tempHorizontalNUPos);
            if (tempHorizontalOffset <= minOffset)
            {
                minOffset = tempHorizontalOffset;
                curPage = i;
            }
        }
    }
 
    #endregion
}

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • c#使用熱鍵實(shí)現(xiàn)程序窗口隱藏示例

    c#使用熱鍵實(shí)現(xiàn)程序窗口隱藏示例

    下面我們將演示如何通過(guò)熱鍵隱藏窗口,會(huì)用到DllImports of Win32 API、CallBacks/Delegates,定制事件與事件的句柄,大家參考使用吧友
    2014-01-01
  • C#基于正則表達(dá)式抓取a標(biāo)簽鏈接和innerhtml的方法

    C#基于正則表達(dá)式抓取a標(biāo)簽鏈接和innerhtml的方法

    這篇文章主要介紹了C#基于正則表達(dá)式抓取a標(biāo)簽鏈接和innerhtml的方法,結(jié)合實(shí)例形式分析了C#使用正則表達(dá)式進(jìn)行頁(yè)面元素的匹配與抓取相關(guān)操作技巧,需要的朋友可以參考下
    2017-06-06
  • C# .net core HttpClientFactory用法及說(shuō)明

    C# .net core HttpClientFactory用法及說(shuō)明

    這篇文章主要介紹了C# .net core HttpClientFactory用法及說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • C#實(shí)現(xiàn)窗體間傳值實(shí)例分析

    C#實(shí)現(xiàn)窗體間傳值實(shí)例分析

    這篇文章主要介紹了C#實(shí)現(xiàn)窗體間傳值的方法,結(jié)合實(shí)例形式較為詳細(xì)的分析了C#針對(duì)窗體間傳值的處理技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-11-11
  • C#利用GDI繪制常見(jiàn)圖形和文字

    C#利用GDI繪制常見(jiàn)圖形和文字

    本文主要介紹了C#中利用GDI來(lái)繪制圖形和文字的方法,并提供的簡(jiǎn)單的示例供大家參考學(xué)習(xí),希望能夠?qū)Υ蠹矣兴鶐椭?/div> 2016-03-03
  • C#實(shí)現(xiàn)文本讀取的7種方式

    C#實(shí)現(xiàn)文本讀取的7種方式

    這篇文章主要介紹了C#實(shí)現(xiàn)文本讀取的7種方式,文本讀取在上位機(jī)開(kāi)發(fā)中經(jīng)常會(huì)使用到,實(shí)現(xiàn)的方式也有很多種,下面我們就來(lái)分享七種方式,需要的小伙伴可以參考一下
    2022-05-05
  • 詳解C#讀取Appconfig中自定義的節(jié)點(diǎn)

    詳解C#讀取Appconfig中自定義的節(jié)點(diǎn)

    我們往往需要在App.config中自定義一些節(jié)來(lái)滿(mǎn)足實(shí)際需要,而不依賴(lài)于App.config的appSettings,下面通過(guò)一個(gè)簡(jiǎn)單的實(shí)例來(lái)說(shuō)明自定義配置節(jié)點(diǎn)的設(shè)置與讀取
    2015-06-06
  • C# List實(shí)現(xiàn)行轉(zhuǎn)列的通用方案

    C# List實(shí)現(xiàn)行轉(zhuǎn)列的通用方案

    本篇通過(guò)行轉(zhuǎn)列引出了System.Linq.Dynamic,并且介紹了過(guò)濾功能,具有很好的參考價(jià)值。下面跟著小編一起來(lái)看下吧
    2017-03-03
  • C#泛型詳解及關(guān)鍵字作用

    C#泛型詳解及關(guān)鍵字作用

    這篇文章主要來(lái)講講c#中的泛型,因?yàn)榉盒驮赾#中有很重要的位置,對(duì)于寫(xiě)出高可讀性,高性能的代碼有著關(guān)鍵的作用,大家都知道泛型公共語(yǔ)言運(yùn)行庫(kù)是非常重要功能,那么為什么使用泛型呢,帶著這個(gè)問(wèn)題一起通過(guò)本文學(xué)習(xí)下吧
    2021-08-08
  • Unity3D使用UGUI開(kāi)發(fā)原生虛擬搖桿

    Unity3D使用UGUI開(kāi)發(fā)原生虛擬搖桿

    這篇文章主要為大家詳細(xì)介紹了Unity3D使用UGUI開(kāi)發(fā)原生虛擬搖桿,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-04-04

最新評(píng)論

泾阳县| 茂名市| 太康县| 德令哈市| 唐河县| 双柏县| 岱山县| 涪陵区| 吉木乃县| 九江县| 古田县| 洛阳市| 商河县| 忻城县| 鲜城| 威信县| 阿克| 耿马| 万山特区| 汤阴县| 姜堰市| 德化县| 庆城县| 绿春县| 万盛区| 陈巴尔虎旗| 左权县| 大同县| 庆阳市| 两当县| 泉州市| 凤凰县| 山西省| 清镇市| 秦皇岛市| 连州市| 合作市| 集安市| 周口市| 屏山县| 福海县|