实现效果图如下 :
UI 设置如下 :
<span style="background-color: rgb(0, 0, 0);">using UnityEngine;
using System.Collections;
using System.Collections.Generic;
public class TestScrollView : MonoBehaviour {
public UIScrollView _Scrollview;
public List<GameObject> _Items = new List<GameObject>();
public Camera _Camera;
void Start () {
SetPos();
}
void SetPos ()
{
Vector3 offset = new Vector3(-400f, 0f, 0f); // 默认第一个格子位置
for (int i = 0; i < 10; i++)
{
GameObject go = _Items[i];
go.transform.localPosition = Vector3.zero;
go.transform.localPosition += offset;
offset += new Vector3(260f, 0f, 0f);
}
}
void Update()
{
if (_Scrollview.isDragging && Time.frameCount % 2 == 0)
{
CalculateItemScale();
}
else if (_Scrollview.GetComponent<SpringPanel>() != null)
{
if (_Scrollview.GetComponent<SpringPanel>().enabled)
{
CalculateItemScale();
}
}
}
void CalculateItemScale()
{
Vector3[] corners = _Scrollview.panel.worldCorners;
Vector3 panelCenter = (corners[2] + corners[0]) * 0.5f;
Vector3 momentum = _Scrollview.currentMomentum * _Scrollview.momentumAmount;
Vector3 moveDelta = NGUIMath.SpringDampen(ref momentum, 9f, 2f);
Vector3 pickingPoint = panelCenter - moveDelta * 0.01f;
Vector3 centerPos = _Camera.WorldToScreenPoint(Vector3.zero);
float maxScale = 0f;
for (int i = 0; i < _Scrollview.transform.childCount; ++i)
{
Transform t = _Scrollview.transform.GetChild(i);
if (!t.gameObject.activeInHierarchy) continue;
Vector3 pos = _Camera.WorldToScreenPoint(t.position);
Vector3 delta = pos - centerPos;
t.transform.localScale = new Vector3(1f - Mathf.Abs(delta.x / 4400f) * 6, 1f - Mathf.Abs(delta.x / 4400f) * 6, 1f);
float scale = Vector3.SqrMagnitude(t.transform.localScale);
if (scale > maxScale)
{
maxScale = scale;
}
float offsetY = -320f * Mathf.Abs(delta.x / 4400f);
t.transform.localPosition = new Vector3(t.transform.localPosition.x, Mathf.RoundToInt(offsetY), t.transform.localPosition.z);
//t.GetComponent<UISprite>().alpha = 1f - Mathf.Abs(delta.x / 4400f) * 3f;
}
}
}</span>