自娛自樂_照片牆

通過調取Win窗口選取圖片並且均勻切割後展示在屏幕中,小圖可以隨鼠標介入放大,周圍圖片做擴散。

  1. 首先,調取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();
    }
  1. 圖片加載好後調取事件對圖片進行切割,在UI上對切割刀圖片進行佈局設置、
    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<RectTransform> gos = new List<RectTransform>();
            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<RectTransform>();
                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<UnityEngine.UI.Image>().sprite= CreatTexture(startX, lengthX, startY, lengthY, cloneFrom);
                //item.transform.GetComponentInChildren<UnityEngine.UI.Text>().text = i + ":" + j;
                //item.GetComponent<UnityEngine.UI.Image>().sprite = CreatTexture(startX, lengthX,startY,lengthY, cloneFrom);// Resources.LoadAll<Sprite>("海星系列00000")[loadIndex];
                // item.GetComponent<UnityEngine.UI.Image>().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<RectTransform>();

        // 添加擴散物體到集合
        foreach (KeyValuePair<RectTransform, Vector2> 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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章