UGUI______ScrollView组件的一些功能 下拉刷新功能

下拉刷新功能:每一次刷新出十个可交互按钮或界面出来,到顶了下拉拖动刷新一下,又弹出来十个,将原来的十个顶到下面去。整个内容框最多容纳三十个。刷新总量超过三十个后,自动去掉最先出来的十个,接着把最新的十个压入到内容框顶端。

重点:灵活运用队列,因为队列是先进先出,也就是最先进来的按钮将被销毁,后进来的往屁股后面加就行了。

UGUI______ScrollView组件的一些功能 下拉刷新功能_第1张图片

UGUI______ScrollView组件的一些功能 下拉刷新功能_第2张图片

UGUI______ScrollView组件的一些功能 下拉刷新功能_第3张图片

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.EventSystems;
using System;

public class ScrollRefresh : MonoBehaviour
{
    //要动态生成的预制体按钮
    public GameObject prefabButton;
    //一个动态开启和关闭的遮罩,为的是在刷新出新的按钮之前,播刷新动画的这段时间里,不能点击已有的按钮。
    public GameObject rayMask;

    //自己创建的一个临时存储的列表,模拟一个简单的数据表或者数据库
    List data = new List();


    //刷新动画的image组件
    public Image circle;
    //每次生成新按钮的数量限制
    float perAngle = 10;
    //刷新动画的时间
    float circleAnimTime = 1.0f;
    //刷新动画时间的计数器
    float circleAnimCounter = 0;


    //滚动卷轴组件引用
    public ScrollRect scrollRect;
    //滚动卷轴下名为content的游戏物体的transform引用
    public RectTransform content;

    //一个用来存储一定数量的队列,最多盛放三十个按钮。盛放的太多,比较垃圾的手机会卡的。
    Queue buttonQueue = new Queue(30);
    
    //当前生成的按钮个数对应的整个数据表中的索引。
    int currentIndex = -1;


    private void Awake()
    {
       
    }


    private void Start()
    {
        //填充模拟的数据表,共317个数据
        for (int i = 1; i <= 317; i++)
        {
            data.Add("按钮"+i);
        }
        //调用刷新函数
        Refresh();
        //将滚动卷轴的垂直方向设为1,也就是自动达到滚动页面的最顶段
        scrollRect.verticalNormalizedPosition = 1;
        
    }

    private void Update()
    {
        //当滚动卷轴组件开启的时候并且内容的位置高度小于指定高度时,播放刷新UI动画。
        if (scrollRect.enabled && content.position.y <= 850.0f/1080.0f*(float)Screen.height)
        {
            scrollRect.enabled = false;
            rayMask.SetActive(true);
            PlayCircleAnim();
        }
    }

    //刷新按钮函数
    void Refresh()
    {
        scrollRect.enabled = true;
        for (int i = 0; i < 10; i++)
        {
            if (currentIndex + 1 < data.Count)
            {
                currentIndex += 1;
                GameObject temp = GameObject.Instantiate(prefabButton, content, false);
                temp.name = data[currentIndex];
                temp.transform.Find("Lable").GetComponent().text = data[currentIndex];
                if (buttonQueue.Count+1>30)
                {
                    GameObject deleteObj=buttonQueue.Dequeue();
                    GameObject.Destroy(deleteObj);
                    buttonQueue.Enqueue(temp);
                }
                else
                {
                    buttonQueue.Enqueue(temp);
                }

            }
            else
            {
                break;
            }
        }
        scrollRect.verticalNormalizedPosition = 1;
    }



    //开始播放刷新UI动画
    void PlayCircleAnim()
    {
        StartCoroutine("CircleAnim");
    }

    //运用携程进行的一个UI刷新动画
    IEnumerator CircleAnim()
    {
        circle.enabled = true;
        while(circleAnimCounter<= circleAnimTime)
        {
            circle.transform.localEulerAngles += new Vector3(0, perAngle, 0);
            yield return new WaitForFixedUpdate();
            circleAnimCounter += Time.fixedDeltaTime;
        }
        circleAnimCounter = 0;
        //刷新动画结束时,关闭刷新图片组件
        circle.enabled = false;
        //刷新动画结束时,调用刷新按钮函数
        Refresh();
        //刷新动画结束时,关闭“防点击遮罩”
        rayMask.SetActive(false);
        StopCoroutine("CircleAnim");
    }



}

 

你可能感兴趣的:(Unity3D)