using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class LoopItem : MonoBehaviour
{
#region 字段
//通过一个方法,获取到边界的信息
private RectTransform rect; //rect 自己的显示区域
private RectTransform viewRect; //viewRect 是scrollview的显示区域
//声明四个边的坐标
private Vector3[] rectCorners;
private Vector3[] viewCorners;
private LoopScrollViewType scrollViewType;
#endregion
#region 事件
public Action onAddHead;
public Action onRemoveHead;
public Action onAddLast;
public Action onRemoveLast;
#endregion
//对两个变量初始化
private void Awake()
{
rect = transform.GetComponent<RectTransform>(); //通过transf.GetComponent 获取到自己的显示区域
viewRect = transform.GetComponentInParent<ScrollRect>().GetComponent<RectTransform>();
rectCorners = new Vector3[4]; //初始化数组
viewCorners = new Vector3[4];
}
void Update()
{
LinstenerCorners();
}
//监听边界
public void LinstenerCorners() {
//获取自身的边界
rect.GetWorldCorners(rectCorners);
//获取显示区域的边界
viewRect.GetWorldCorners(viewCorners);
if (IsFirst()) //如果是头
{
switch (scrollViewType)
{
case LoopScrollViewType.Horizontal:
if (rectCorners[3].x < viewCorners[0].x)
{
//把头节点给隐藏掉
if (onRemoveHead != null) { onRemoveHead(); } //如果它不为空,触发onRemoveHead
}
if (rectCorners[0].x > viewCorners[0].x)
{
//添加头节点
if (onAddHead != null) { onAddHead(); }
}
break;
case LoopScrollViewType.Vertical:
if (rectCorners[0].y > viewCorners[1].y)
{
//把头节点给隐藏掉
if (onRemoveHead != null) { onRemoveHead(); } //如果它不为空,触发onRemoveHead
}
if (rectCorners[1].y < viewCorners[0].y)
{
//添加头节点
if (onAddHead != null) { onAddHead(); }
}
break;
}
}
if (IsLast()) //如果是尾
{
switch (scrollViewType)
{
case LoopScrollViewType.Horizontal:
//添加尾部
if (rectCorners[3].x < viewCorners[3].x)
{
if (onAddLast != null) { onAddLast(); }
}
//回收尾部
if (rectCorners[0].x > viewCorners[3].x)
{
if (onRemoveHead != null) { onRemoveHead(); }
}
break;
case LoopScrollViewType.Vertical:
//添加尾部
if (rectCorners[0].y > viewCorners[0].y)
{
if (onAddLast != null) { onAddLast(); }
}
//回收尾部
if (rectCorners[1].y < viewCorners[0].y)
{
if (onRemoveHead != null) { onRemoveHead(); }
}
break;
}
}
}
//判断是不是第一个
public bool IsFirst() {
for (int i = 0; i < transform.parent.childCount; i++) //计算子物体的数量,头部从0开始找
{
if (transform.parent.GetChild(i).gameObject.activeSelf) //依次获取子物体,并判断是否是显示状态
{
if (transform.parent.GetChild(i) == transform) //判断是不是它自己
{
return true;
}
break;
}
}
return false;
}
//是不是最后一个
public bool IsLast() {
for (int i = transform.parent.childCount - 1; i >= 0; i--) //计算子物体的数量,尾部从后往前找
{
if (transform.parent.GetChild(i).gameObject.activeSelf) //依次获取子物体,并判断是否是显示状态
{
if (transform.parent.GetChild(i) == transform) //判断是不是它自己
{
return true;
}
break;
}
}
return false;
}
//设置LoopScrollViewd 的类型
public void SetLoopScrollViewType( LoopScrollViewType loopScrollViewType ) {
this.scrollViewType = loopScrollViewType;
}
}