using UnityEngine;
using UnityEngine.UI;
using System.Collections;
using UnityEngine.EventSystems;
public class PictureZoomForWindows : MonoBehaviour, IDragHandler, IPointerDownHandler
{
#region Zoom
/// <summary>
/// 得到圖片
/// </summary>
public RectTransform image;
/// <summary>
/// 是否有兩隻手指按下
/// </summary>
private bool isTwoTouch = false;
[SerializeField, Header("縮放")]
float minExtend = 0.5f;
[SerializeField, Header("擴大")]
float maxExtend = 10.0f;
#endregion
#region Move
// 當前面板
[SerializeField]
private RectTransform panelRectTransform;
// 父節點,這個最好是UI父節點,因爲它的矩形大小剛好是屏幕大小
[SerializeField]
private RectTransform parentRectTransform;
#endregion
[SerializeField]
Image images;
[SerializeField]
bool isScrollWheel = false;
[SerializeField]
private float mouseExtendScale = 0.0f;
[SerializeField, Header("鼠標縮放計算")]
bool scrollScaleCal = false;
[SerializeField, Range(1, 10)]
int scaleFactor = 3;
Vector3 offsetPos; //存儲按下鼠標時的圖片-鼠標位置差
void Awake()
{
panelRectTransform = transform.parent as RectTransform;
parentRectTransform = panelRectTransform.parent as RectTransform;
}
// Use this for initialization
void Start()
{
}
private void LateUpdate()
{
#if UNITY_EDITOR || UNITY_STANDALONE_WIN
MouseExtend();
#endif
}
void MouseExtend()
{
if (isScrollWheel)
{
float scrollValue = Input.GetAxis("Mouse ScrollWheel");
if (scrollValue < 0)
{
if (mouseExtendScale > 0)
{
mouseExtendScale = 0;
}
mouseExtendScale += scrollValue * scaleFactor;
scrollScaleCal = true;
#if UNITY_EDITOR
Debug.Log("Zoom Out:\t" + mouseExtendScale);
#endif
}
//-Zoom In-//
if (scrollValue > 0)
{
if (mouseExtendScale < 0)
{
mouseExtendScale = 0;
}
mouseExtendScale += scrollValue * scaleFactor;
scrollScaleCal = true;
#if UNITY_EDITOR
Debug.Log("Zoom In:\t" + scrollValue);
#endif
}
PictureScale();
}
}
/// <summary>
/// 圖片縮放核心腳本 Windows 平臺放大縮小
/// </summary>
/// <param name="scaleDistance">縮放距離</param>
private void PictureScale()
{
if (scrollScaleCal)
{
//當前圖片的縮放
Vector3 curImageScale = new Vector3(image.localScale.x, image.localScale.y, 1);
//兩根手指上一幀和這幀之間的距離差
//因爲100個像素代表單位1,把距離差除以100看縮放幾倍
float changeScaleDistance = mouseExtendScale / 100;
#if UNITY_EDITOR
Debug.Log("ChangeScaleDistance:\t" + changeScaleDistance);
#endif
//因爲縮放 Scale 是一個Vector3,所以這個代表縮放的Vector3的值就是縮放的倍數
Vector3 changeScale = new Vector3(changeScaleDistance, changeScaleDistance, 0);
//圖片的縮放等於當前的縮放加上 修改的縮放
image.localScale = curImageScale + changeScale;
//控制縮放級別
image.localScale = new Vector3(Mathf.Clamp(image.localScale.x, minExtend, maxExtend), Mathf.Clamp(image.localScale.y, minExtend, maxExtend), 1);
scrollScaleCal = false;
}
}
/// <summary>
/// 將鼠標的位置座標進行鉗制,然後加上位置差再賦值給圖片position
/// </summary>
/// <param name="eventData"></param>
public void OnDrag(PointerEventData eventData)
{
panelRectTransform.position = new Vector3(Mathf.Clamp(Input.mousePosition.x, 0, Screen.width), Mathf.Clamp(Input.mousePosition.y, 0, Screen.height), 0) + offsetPos;
}
/// <summary>
/// 鼠摁下獲取偏差位置
/// </summary>
/// <param name="eventData"></param>
public void OnPointerDown(PointerEventData eventData)
{
offsetPos = panelRectTransform.position - Input.mousePosition;
}
}