using UnityEngine;
using UnityEngine.UI;
using UnityEngine.EventSystems;
using System.Collections;
public class DragPanel : MonoBehaviour, IDragHandler, IEndDragHandler, IBeginDragHandler
{
private Vector2 originalLocalPointerPosition;
private Vector3 originalPanelLocalPosition;
public RectTransform panelRectTransform;
public RectTransform restrictRectTransform;
public float Damping;
private Vector3 inertia;
private float recordEndTime;
private readonly float _refWidth = 768.0f;
private readonly float _refHeight = 1334.0f;
private readonly float _refRatio = 768.0f / 1334.0f;
public void Awake()
{
inertia = Vector3.zero;
restrictRectTransform.sizeDelta = (panelRectTransform.sizeDelta * 2 - new Vector2(_refWidth, Screen.height * (_refWidth / Screen.width)));
}
public void OnBeginDrag(PointerEventData data)
{
inertia = Vector3.zero;
originalPanelLocalPosition = panelRectTransform.localPosition;
RectTransformUtility.ScreenPointToLocalPointInRectangle(restrictRectTransform, data.position, data.pressEventCamera, out originalLocalPointerPosition);
}
public void OnDrag(PointerEventData data)
{
if (panelRectTransform == null || restrictRectTransform == null)
return;
Vector2 localPointerPosition;
if (RectTransformUtility.ScreenPointToLocalPointInRectangle(restrictRectTransform, data.position, data.pressEventCamera, out localPointerPosition))
{
Vector3 offsetToOriginal = localPointerPosition - originalLocalPointerPosition;
panelRectTransform.localPosition = originalPanelLocalPosition + offsetToOriginal;
}
ClampToWindow();
}
public void OnEndDrag(PointerEventData data)
{
inertia = data.delta;
recordEndTime = Time.time;
}
public void Update()
{
if (inertia.magnitude > 0.1)
{
panelRectTransform.localPosition = panelRectTransform.localPosition + inertia;
inertia = Vector3.Slerp(inertia, Vector3.zero, Mathf.Pow((Time.time - recordEndTime), 2) * Damping);
ClampToWindow();
}
}
// Clamp panel to area of parent
void ClampToWindow()
{
Vector3 pos = panelRectTransform.localPosition;
Vector3 minPosition = restrictRectTransform.rect.min - panelRectTransform.rect.min;
Vector3 maxPosition = restrictRectTransform.rect.max - panelRectTransform.rect.max;
pos.x = Mathf.Clamp(panelRectTransform.localPosition.x, minPosition.x, maxPosition.x);
pos.y = Mathf.Clamp(panelRectTransform.localPosition.y, minPosition.y, maxPosition.y);
panelRectTransform.localPosition = pos;
}
public void OpenFocs(Vector3 offset)
{
transform.position -= offset;
ClampToWindow();
}
}