在本文阴孟,筆者將教大家怎么簡單的做出運行時圖片尺寸縮放功能。
前言:
老板需要拖拽監(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é)語:
不禁感慨愿题,真相往往如此簡單损俭!