com.alicizax.unity.ui.exten.../Runtime/RecyclerView/Navigation/RecyclerNavigationBridge.cs

59 lines
1.6 KiB
C#
Raw Normal View History

using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;
namespace AlicizaX.UI
{
[DisallowMultipleComponent]
public sealed class RecyclerNavigationBridge : Selectable, ISelectHandler, IMoveHandler, ISubmitHandler
{
[SerializeField] private MoveDirection defaultEntryDirection = MoveDirection.Down;
private RecyclerView recyclerView;
protected override void Awake()
{
base.Awake();
transition = Transition.None;
Navigation navigationConfig = navigation;
navigationConfig.mode = Navigation.Mode.None;
navigation = navigationConfig;
2026-04-13 15:45:34 +08:00
#if !UX_NAVIGATION
interactable = false;
enabled = false;
return;
#endif
recyclerView = GetComponent<RecyclerView>();
}
public override void OnSelect(BaseEventData eventData)
{
base.OnSelect(eventData);
TryEnter(defaultEntryDirection);
}
public override void OnMove(AxisEventData eventData)
{
if (!TryEnter(eventData.moveDir))
{
base.OnMove(eventData);
}
}
public void OnSubmit(BaseEventData eventData)
{
TryEnter(defaultEntryDirection);
}
private bool TryEnter(MoveDirection direction)
{
2026-04-13 15:45:34 +08:00
#if UX_NAVIGATION
recyclerView ??= GetComponent<RecyclerView>();
return recyclerView != null && recyclerView.TryFocusEntry(direction);
2026-04-13 15:45:34 +08:00
#else
return false;
#endif
}
}
}