using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.EventSystems; namespace AX.ImageViewer { public class ImageViewerMovement : MonoBehaviour { #region Variables [SerializeField] private Canvas canvas; private RectTransform canvasTR; private Camera canvasCam; [SerializeField] private RectTransform window; [SerializeField] private ImageViewer imageViewer; [SerializeField] private RectTransform ImagePanelRect; private Vector2 offset = new Vector3(); private Vector2 initialTouchPos = Vector2.zero; private Vector2 initialAnchoredPos, initialSizeDelta; #endregion #region Messages private void Awake() { canvasTR = canvas.GetComponent(); } #endregion #region Pointer Events public void OnDragStarted(BaseEventData data) { PointerEventData pointer = (PointerEventData)data; canvasCam = pointer.pressEventCamera; RectTransformUtility.ScreenPointToLocalPointInRectangle(window, pointer.pressPosition, canvasCam, out initialTouchPos); } public void OnDrag(BaseEventData data) { PointerEventData pointer = (PointerEventData)data; Vector2 touchPos; RectTransformUtility.ScreenPointToLocalPointInRectangle(window, pointer.position, canvasCam, out touchPos); window.anchoredPosition += touchPos - initialTouchPos; } public void OnResizeStarted(BaseEventData data) { PointerEventData pointer = (PointerEventData)data; canvasCam = pointer.pressEventCamera; initialAnchoredPos = window.anchoredPosition; initialSizeDelta = window.sizeDelta; RectTransformUtility.ScreenPointToLocalPointInRectangle(canvasTR, pointer.pressPosition, canvasCam, out initialTouchPos); } public void OnResize(BaseEventData data) { PointerEventData pointer = (PointerEventData)data; Vector2 touchPos; RectTransformUtility.ScreenPointToLocalPointInRectangle(canvasTR, pointer.position, canvasCam, out touchPos); Vector2 delta = touchPos - initialTouchPos; Vector2 newSize = initialSizeDelta + new Vector2(delta.x, -delta.y); if (newSize.x < imageViewer.minWidth) newSize.x = imageViewer.minWidth; if (newSize.y < imageViewer.minHeight) newSize.y = imageViewer.minHeight; newSize.x = (int)newSize.x; newSize.y = (int)newSize.y; delta = newSize - initialSizeDelta; window.anchoredPosition = initialAnchoredPos + new Vector2(delta.x * 0.5f, delta.y * -0.5f); window.sizeDelta = newSize; } //ImagePanelDrag public void OnImagePanelPointerDown(BaseEventData data) { PointerEventData pointer = (PointerEventData)data; Vector2 mouseDown = pointer.position; Vector2 mouseUguiPos = new Vector2(); bool isRect = RectTransformUtility.ScreenPointToLocalPointInRectangle(canvasTR, mouseDown, pointer.enterEventCamera, out mouseUguiPos); if(isRect) offset = ImagePanelRect.anchoredPosition - mouseUguiPos; } public void OnImagePanelDrag(BaseEventData data) { PointerEventData pointer = (PointerEventData)data; Vector2 mouseDrag = pointer.position; Vector2 uguiPos = new Vector2(); bool isRect = RectTransformUtility.ScreenPointToLocalPointInRectangle(canvasTR, mouseDrag, pointer.enterEventCamera, out uguiPos); if (isRect) ImagePanelRect.anchoredPosition = offset + uguiPos; } public void OnImagePanelPointerUp(BaseEventData data) { PointerEventData pointer = (PointerEventData)data; offset = Vector2.zero; } public void OnImagePanelEndDrag(BaseEventData data) { PointerEventData pointer = (PointerEventData)data; offset = Vector2.zero; } #endregion } }