using System.Collections;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
using UnityEngine.UI;
public class RotationPageView : MonoBehaviour
{
public Vector2 ItemSize;
public List<Sprite> SpriteList;
private List<PageItem> ItemList;
private List<ItemPosData> ItemPosList;
private List<ItemIdData> itemIdList;
public float ScareMax;
public float ScareMin;
public float YMax;
public float YMin;
public float AlphaMin;
public float OffSetX;
public float OffSety;
void Start()
{
ItemList = new List<PageItem>();
ItemPosList = new List<ItemPosData>();
itemIdList = new List<ItemIdData>();
CreateItem();
CaculateData();
}
private GameObject CreateTempate()
{
GameObject temp = new GameObject("Template");
temp.AddComponent<PageItem>();
temp.AddComponent<RectTransform>().sizeDelta = ItemSize;
temp.AddComponent<Image>();
return temp;
}
private void CreateItem()
{
GameObject temp = CreateTempate();
for (int i = 0; i < SpriteList.Count; i++)
{
PageItem item = Instantiate(temp).GetComponent<PageItem>();
item.Index = i;
item.SetImage(SpriteList[i]);
item.SetParent(transform);
item.AddEventlistenr(change);
ItemList.Add(item);
}
}
public void change(float offX) {
int symbol = 0;
symbol = offX > 0 ? 1 : -1;
rotateItem(symbol);
}
private void rotateItem(int symbol) {
int allNums = itemIdList.Count;
int lens = allNums - 1;
int maxValues = lens;
for (int i = 0; i < ItemPosList.Count; i++)
{
int index = ItemList[i].Index;
if (symbol < 0)
{
if (index == 0)
{
index = maxValues;
}
else
{
index = index + symbol;
}
}
else {
if (index == maxValues)
{
index = 0;
}
else
{
index = index + symbol;
}
}
ItemList[i].Index = index;
}
for (int i = 0; i < allNums; i++) {
int index = ItemList[i].Index;
ItemList[i].SetPositon(ItemPosList[index]);
}
}
private void CaculateData()
{
float lengthx = (ItemSize.x + OffSetX) * 4;
float lengthy = (ItemSize.y + OffSety) * 4;
float radio = 1.0f / SpriteList.Count;
float tempRadio = 0f;
for (int i = 0; i < SpriteList.Count; i++)
{
ItemPosData pos = new ItemPosData();
ItemIdData itemId = new ItemIdData();
itemId.Id = i;
pos.X = GetX(tempRadio, lengthx);
pos.Y = GetY(tempRadio, YMax, YMin);
pos.Alpha = GetAlpha(tempRadio, AlphaMin);
pos.ScareTimes = GetScaraTimes(tempRadio, ScareMax, ScareMin);
tempRadio += radio;
pos.Order = i;
ItemPosList.Add(pos);
itemIdList.Add(itemId);
}
itemIdList = itemIdList.OrderBy(u => ItemPosList[u.Id].ScareTimes).ToList();
for (int i = 0; i < itemIdList.Count; i++) //根据缩放有小到大,排列了id列表
{
int id = itemIdList[i].Id;
ItemPosList[id].Order = i;
}
for (int i = 0; i < ItemPosList.Count; i++)
{
ItemList[i].SetPositon(ItemPosList[i]);
}
}
private float GetX(float radio, float length)
{
if (radio < 0 || radio > 1)
{
Debug.Log("系数错误");
return 0;
}
if (radio >= 0 && radio <= 0.25f)
{
return radio * length;
}
else if (radio > 0.25 && radio < 0.75f)
{
return (0.5f - radio) * length;
}
else
{
return (radio - 1f) * length;
}
}
private float GetAlpha(float radio, float length)
{
if (radio < 0 || radio > 1)
{
Debug.Log("系数错误");
return 0;
}
if (radio >= 0 && radio <= 0.25f)
{
return 1;
}
else if (radio > 0.25 && radio < 0.75f)
{
return length;
}
else
{
return 1;
}
}
private float GetY(float radio, float scareMax, float scareMin)
{
float scareSub = scareMax - scareMin;
if (radio < 0f || radio > 1f)
{
Debug.Log("系数错误");
return 0;
}
if (radio == 0 || radio == 1f)
{
return scareSub;
}
if (radio > 0 && radio <= 0.5f)
{
return (1 - radio) * scareSub;//0.5 ~ 1
}
else
{
return radio * scareSub;
}
}
private float GetScaraTimes(float radio, float scareMax, float scareMin)
{
float scareSub = scareMax - scareMin;
if (radio < 0f || radio > 1f)
{
Debug.Log("系数错误");
return 0;
}
if (radio == 0 || radio == 1f)
{
return scareSub;
}
if (radio > 0 && radio <= 0.5f)
{
return (1 - radio) * scareSub;//0.5 ~ 1
}
else
{
return radio * scareSub;
}
}
}
public class ItemPosData
{
public float X; //位置
public float Y; //位置
public float ScareTimes;//缩放
public float Alpha; //Alpha
public int Order; //层级参数
}
public class ItemIdData
{
public int Id;
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using DG.Tweening;
using UnityEngine.UI;
using UnityEngine.EventSystems;
using System;
public class PageItem : MonoBehaviour,IDragHandler,IEndDragHandler
{
private float X;
private int index;
private float ScareTimes;
private float offX = 0;
private Action<float> MoveAction;
private Image myImage;
private Image MyImage
{
get {
if (myImage == null)
myImage = GetComponent<Image>();
return myImage;
}
}
private RectTransform myRect;
private RectTransform MyRect {
get {
if (myRect == null)
myRect = GetComponent<RectTransform>();
return myRect;
}
}
public int Index
{
get=> index; set => index = value;
}
void Start()
{
}
// Update is called once per frame
//void Update()
//{
//}
public void SetParent(Transform parent) {
transform.SetParent(parent);
}
public void SetPositon(ItemPosData posData) {
//MyRect.DOAnchorPos(Vector2.right * posData.X, 1.0f);
MyRect.DOAnchorPosX(posData.X, 1.0f);
MyRect.DOAnchorPosY(-posData.Y, 1.0f);
MyRect.GetComponent<Image>().DOFade(posData.Alpha, 1.0f);
MyRect.DOScale(Vector2.one * posData.ScareTimes, 1.0f);
StartCoroutine(wait(posData.Order));
}
IEnumerator wait(int order) {
yield return new WaitForSeconds(0.5f);
transform.SetSiblingIndex(order);
}
public void SetImage(Sprite sprite) {
MyImage.sprite = sprite;
}
public void AddEventlistenr(Action<float> move) {
MoveAction = move;
}
public void OnDrag(PointerEventData eventData)
{
offX += eventData.delta.x;
//Debug.Log("offX=========" + offX);
}
public void OnEndDrag(PointerEventData eventData)
{
MoveAction(offX);
offX = 0;
}
}
效果如下
借鉴自
https://blog.csdn.net/Y_fly_tiger/article/details/107086560