通过调取Win窗口选取图片并且均匀切割后展示在屏幕中,小图可以随鼠标介入放大,周围图片做扩散。
void ButtonClick()
{
OpenFileName ofn = new OpenFileName();
ofn.structSize = Marshal.SizeOf(ofn);
ofn.filter = "JPG Files (*.jpg)\0*.jpg\0All Files (*.*)\0*.*\0";
ofn.file = new string(new char[256]);
ofn.maxFile = ofn.file.Length;
ofn.fileTitle = new string(new char[64]);
ofn.maxFileTitle = ofn.fileTitle.Length;
ofn.initialDir = UnityEngine.Application.dataPath;//默认路径
ofn.title = "打开文件";
ofn.defExt = "JPG";//显示文件的类型
//注意 一下项目不一定要全选 但是0x00000008项不要缺少
ofn.flags = 0x00080000 | 0x00001000 | 0x00000800 | 0x00000200 | 0x00000008;//OFN_EXPLORER|OFN_FILEMUSTEXIST|OFN_PATHMUSTEXIST| OFN_ALLOWMULTISELECT|OFN_NOCHANGEDIR
if (DllTest.GetOpenFileName(ofn))
{
StartCoroutine(WaitLoad(ofn.file));//加载图片到panle
}
}
//加载图片
IEnumerator WaitLoad(string fileName)
{
WWW wwwTexture = new WWW("file://" + fileName);
Debug.Log(wwwTexture.url);
yield return wwwTexture;
tex = wwwTexture.texture;
EnabaleSubmit();
}
public void CreatTexture(Texture2D cloneFrom)
{
startXPos = -(column * distanceRandomMaxX) / 2 - distanceRandomMaxX / 2 + Screen.width;
startZPos = (row * distanceRandomMaxY) / 2 - distanceRandomMaxY / 2;
if (deleateItemList.Count!=0)
{
itemPosDict.Clear();
ClearDeleateItemList();
}
int width = cloneFrom.width;
int height = cloneFrom.height;
Debug.Log("width:" + width + "|height:" + height);
int lengthX = cloneFrom.width / row;
int lengthY = cloneFrom.height / column;
Debug.Log("lengthX:" + lengthX + "|lengthY:" + lengthY);
int startX = 0;
int startY = 0;
int endX = startX + lengthX;
int endY = startY + lengthY;
Debug.Log("endX:" + endX + "|endY:" + endY);
for (int i = 0; i< row; i++)
{
List gos = new List();
goList.Add(gos);
float lastPosX = startXPos;
startY = ((row-1)-i) * lengthY;
for (int j=0;j< column; j++)
{
RectTransform item = (Instantiate(prefab.gameObject) as GameObject).GetComponent();
item.name = i + " " + j;
item.transform.SetParent(prefab.parent);
Vector2 startPos = new Vector3(lastPosX + distanceRandomMaxX, startZPos - i * distanceRandomMinY);
lastPosX = startPos.x;
item.anchoredPosition = startPos;
Vector2 endPos = startPos;
endPos.x = endPos.x - initMoveDistance;
startX = j * lengthX;
item.GetComponent().sprite= CreatTexture(startX, lengthX, startY, lengthY, cloneFrom);
//item.transform.GetComponentInChildren().text = i + ":" + j;
//item.GetComponent().sprite = CreatTexture(startX, lengthX,startY,lengthY, cloneFrom);// Resources.LoadAll("海星系列00000")[loadIndex];
// item.GetComponent().color = new Color(i * 2f / 255f, j * 2f / 255f, (i * j % 255f) / 255f, 0.5f);
Tweener tweener = item.DOAnchorPosX(endPos.x, Random.Range(1.8f, 2f)); // 缓动到目标位置
tweener.SetDelay(j * 0.1f + (this.row - i) * 0.1f); // 延时
tweener.SetEase(Ease.InSine); // 缓动效果
tweener.SetEase(Ease.InFlash); // 缓动效果
item.gameObject.SetActive(true);
gos.Add(item);
itemPosDict.Add(item, endPos);
deleateItemList.Add(item);
}
}
}
Sprite CreatTexture(int startX, int lengthX, int startY, int lengthY, Texture2D tagit)
{
Texture2D creat = new Texture2D(lengthX, lengthY, TextureFormat.ARGB32, false);
int indexX = 0;
int indexY = 0;
int endX = startX + lengthX;
int endY = startY + lengthY;
for (int i = startX; i < endX; i++)
{
indexY = 0;
for (int j = startY; j < endY; j++)
{
creat.SetPixel(indexX, indexY, tagit.GetPixel(i, j));
indexY++;
}
indexX++;
}
creat.Apply();
Rect rect = new Rect(0, 0, lengthX, lengthY);
Vector2 point = new Vector2(0.5f, 0.5f);
Sprite sprit = Sprite.Create(creat, rect, point);
return sprit;
}
3.鼠标移入事件
public void OnMousePointEnter(RectTransform item)
{
// 缓动改变中心物体尺寸
item.DOScale(enlargeSize, 0.5f);
Vector2 pos = itemPosDict[item];
changedItemList = new List();
// 添加扩散物体到集合
foreach (KeyValuePair i in itemPosDict)
{
if (Vector2.Distance(i.Value, pos) < radiateSize)
{
changedItemList.Add(i.Key);
}
}
// 缓动来解决扩散物体的动画
for (int i = 0; i < changedItemList.Count; i++)
{
Vector2 targetPos = itemPosDict[item] + (itemPosDict[changedItemList[i]] - itemPosDict[item]).normalized * radiateSize;
changedItemList[i].DOAnchorPos(targetPos, 0.8f);
}
}
4.鼠标移出事件
public void OnMousePointExit(RectTransform go)
{
// 缓动恢复中心物体尺寸
go.DOScale(1, 1);
// 缓动将扩散物体恢复到初始位置
for (int i = 0; i < changedItemList.Count; i++)
{
changedItemList[i].DOAnchorPos(itemPosDict[changedItemList[i]], 0.8f);
}
}
下面是工程链接地址:https://download.csdn.net/download/qq_24099007/10503578