[Unity 3d] 實現(xiàn)拖拽圖片縮放尺寸只需要簡單3句代碼

在本文,筆者將教大家怎么簡單的做出運行時圖片尺寸縮放功能。

前言:

老板需要拖拽監(jiān)控播放器左下角能夠縮放播放器界面,本以為好難啊,沒想到這么簡單,做個筆記水上一貼,也分享給大家吧。

實現(xiàn):

先是UI結(jié)構(gòu):


  • 播放器開啟時會存在一個灰色的遮罩覆蓋屏幕,所以將 MonitorPlayer 覆蓋全屏
  • 名為 Background 的播放器作為 MonitorPlayer 子組件,方便控制
  • Sizer 作為 BackGround 子組件,用于接收拖拽事件而驅(qū)動 BackGround實現(xiàn)播放器尺寸縮放。

然后是關(guān)鍵代碼:

    public float min; //最小縮放尺寸與原尺寸比
    public float max; //最大縮放尺寸與原尺寸比
    private Vector2 orignSize; //緩存原始尺寸
    public RectTransform targetRect; //被控制的 圖片 
    void Awake()
    {
        orignSize = targetRect.sizeDelta;
    }
    void IDragHandler.OnDrag(PointerEventData eventData) //僅僅實現(xiàn)一個 IDragHandler 接口就行了
    {
        float x = Mathf.Clamp(targetRect.sizeDelta.x + eventData.delta.x, orignSize.x*min, orignSize.x*max);
        //float y = Mathf.Clamp(targetRect.sizeDelta.y - eventData.delta.y, orignSize.y*min, orignSize.y*max);
        float y = x / targetRect.sizeDelta.x * targetRect.sizeDelta.y; //相比于上一句實現(xiàn)了Image 等比縮放,任選一句。
        targetRect.sizeDelta= new Vector2 (x,y);
    }

完整代碼:

/*
 * Target RectTransform Pivot 必須是 (0,1)
 */
using UnityEngine;
using UnityEngine.EventSystems;

public class ImageResizer : MonoBehaviour, IPointerEnterHandler, IPointerExitHandler, IDragHandler
{
    public float min;
    public float max;
    private Vector2 orignSize;
    [SerializeField]
    private RectTransform targetRect;
    [SerializeField]
    private Texture2D cursorHandle; //鼠標(biāo)

    void Awake()
    {
        orignSize = targetRect.sizeDelta;
    }

    #region  Function Deal with size

    void IDragHandler.OnDrag(PointerEventData eventData)
    {
        float x = Mathf.Clamp(targetRect.sizeDelta.x + eventData.delta.x, orignSize.x*min, orignSize.x*max);
        //float y = Mathf.Clamp(targetRect.sizeDelta.y - eventData.delta.y, orignSize.y*min, orignSize.y*max); 
        float y = x / targetRect.sizeDelta.x * targetRect.sizeDelta.y; //等比縮放
        targetRect.sizeDelta= new Vector2 (x,y);
    }
    // 重置Target 尺寸
    public void ResetSize()
    {
        targetRect.sizeDelta = orignSize;
    }
    #endregion
    #region Cursor Behaviours
    public void OnPointerEnter(PointerEventData eventData)
    {
        Cursor.SetCursor(cursorHandle, Vector2.zero, CursorMode.Auto);
    }
    public void OnPointerExit(PointerEventData eventData)
    {
        SetDefaultCursor();
    }
    private static void SetDefaultCursor()
    {
        Cursor.SetCursor(null, Vector2.zero, CursorMode.Auto);
    }
    private void OnDisable()
    {
        SetDefaultCursor();
    }
    private void OnDestroy()
    {
        SetDefaultCursor();
    }
    #endregion
}

Tips : 完整代碼僅僅是增加了鼠標(biāo)光標(biāo)的處理哈~

演示:

結(jié)語:

不禁感慨,真相往往如此簡單!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 請清楚自己想為讀者提供怎樣的樂趣 大澤:大家好,今天這堂課是關(guān)于“如何設(shè)計情節(jié)”的。事實上,我寫小說基本上不對情節(jié)...
    師者之寫道閱讀 95評論 0 0
  • 脫下鞋子跳舞,赤著腳太空漫步 青春的起點,我們聽著那句: 最好的朋友在身邊 最愛的人就在對面 70后的青春是一張老...
    楊小半閱讀 487評論 2 7
  • 煩惱無聊的半天終于過去了!輪到這很累,但非常有趣的下午了。接下來讓我來給你說一說吧。我們回到賓館休息了一下,就馬上...
    candy2008閱讀 610評論 0 2
  • 內(nèi)存泄漏問題一直是項目開發(fā)中的一大問題,本文力求幫助從事過一段時間工作的iOS開發(fā)者快速尋找App中的內(nèi)存泄漏問題...
    鄉(xiāng)水情緣閱讀 353評論 0 1
  • 3月18日:今天是第一天讀《大學(xué)》,第一遍的時候我讀的非常慢,有不認(rèn)識的字,讀完前一個字,后一個字都接不上,心里有...
    安琪w閱讀 749評論 0 0

友情鏈接更多精彩內(nèi)容