using RK_Runtime.RK_Space_UI; using UnityEngine; using UnityEngine.EventSystems; using UnityEngine.UI; public class VC_SubScrollViewCheck : RK_UIMonoViewComponent, IBeginDragHandler, IDragHandler, IEndDragHandler, IScrollHandler, IInitializePotentialDragHandler, ICanvasElement, ILayoutGroup { public ScrollRect ParentScrollRect; private bool m_IsDrag = false; private Vector2 m_PrePos; public float minWidth; public void CalculateLayoutInputHorizontal() { ParentScrollRect.CalculateLayoutInputHorizontal(); } public void CalculateLayoutInputVertical() { ParentScrollRect.CalculateLayoutInputVertical(); } public void GraphicUpdateComplete() { ParentScrollRect.GraphicUpdateComplete(); } public bool IsDestroyed() { return ParentScrollRect.IsDestroyed(); } public void LayoutComplete() { ParentScrollRect.LayoutComplete(); } public void OnBeginDrag(PointerEventData eventData) { m_IsDrag = true; m_PrePos = eventData.position; PassEvent(eventData, ExecuteEvents.beginDragHandler); } public void OnDrag(PointerEventData eventData) { bool parDir = ParentScrollRect.vertical; var offset = eventData.position - m_PrePos; var x = Mathf.Abs(offset.x); var y = Mathf.Abs(offset.y); if (parDir) { if (y > x) { PassEvent(eventData, ExecuteEvents.dragHandler); } } else { if (y < x) { PassEvent(eventData, ExecuteEvents.dragHandler); } } m_PrePos = eventData.position; } public void OnEndDrag(PointerEventData eventData) { m_IsDrag = false; PassEvent(eventData, ExecuteEvents.endDragHandler); } public void OnInitializePotentialDrag(PointerEventData eventData) { PassEvent(eventData, ExecuteEvents.initializePotentialDrag); } public void OnScroll(PointerEventData eventData) { PassEvent(eventData, ExecuteEvents.scrollHandler); } //把事件透下去 public void PassEvent<T>(PointerEventData data, ExecuteEvents.EventFunction<T> function) where T : IEventSystemHandler { //List<RaycastResult> results = new List<RaycastResult>(); //EventSystem.current.RaycastAll(data, results); //GameObject current = data.pointerCurrentRaycast.gameObject; //for (int i = 0; i < results.Count; i++) //{ // if (current != results[i].gameObject && GetComponent<VC_SubScrollViewCheck>() == null) // { // ExecuteEvents.Execute(ParentScrollRect.gameObject, data, function); // //RaycastAll后ugui会自己排序,如果你只想响应透下去的最近的一个响应,这里ExecuteEvents.Execute后直接break就行。 // break; // } //} ExecuteEvents.Execute(ParentScrollRect.gameObject, data, function); } public void Rebuild(CanvasUpdate executing) { ParentScrollRect.Rebuild(executing); } public void SetLayoutHorizontal() { ParentScrollRect.SetLayoutHorizontal(); } public void SetLayoutVertical() { ParentScrollRect.SetLayoutVertical(); } }