關於unity 雙重ScrollRect的水平移動與垂直移動疊加處理
阿新 • • 發佈:2019-02-06
當scrollRect中的一個個子元素也分別是scorllRect時(子scorllRect和父scorllRect運動方向不一樣),根據手指的移動判斷是響應子scorllRect的drag事件,還是響應父scorllRect的drag事件。
先看效果:
程式碼如下
public class VHScrollRect : ScrollRect { public ScrollRect parentScroll; public bool isVertical = false; private bool isSelf = false; public override void OnBeginDrag(PointerEventData eventData) { Vector2 touchDeltaPosition; #if UNITY_EDITOR float delta_x = Input.GetAxis("Mouse X"); float delta_y = Input.GetAxis("Mouse Y"); touchDeltaPosition = new Vector2(delta_x, delta_y); #endif #if UNITY_ANDROID && !UNITY_EDITOR touchDeltaPosition = Input.GetTouch(0).deltaPosition; #endif if (isVertical) { if (Mathf.Abs(touchDeltaPosition.x) < Mathf.Abs(touchDeltaPosition.y)) { isSelf = true; base.OnBeginDrag(eventData); } else { isSelf = false; parentScroll.OnBeginDrag(eventData); } } else { if (Mathf.Abs(touchDeltaPosition.x) > Mathf.Abs(touchDeltaPosition.y)) { isSelf = true; base.OnBeginDrag(eventData); } else { isSelf = false; parentScroll.OnBeginDrag(eventData); } } } public override void OnDrag(PointerEventData eventData) { if (isSelf) { base.OnDrag(eventData); } else { parentScroll.OnDrag(eventData); } } public override void OnEndDrag(PointerEventData eventData) { if (isSelf) { base.OnEndDrag(eventData); } else { parentScroll.OnEndDrag(eventData); } } }
呼叫前將
parentScroll
賦值即可。
效果為水平或者垂直移動時都是相對獨立的,不會同時觸發。
感謝soctti的幫助 : 他的部落格