[Opt] 统一ScrollBar显示

This commit is contained in:
陈思海 2026-04-29 19:03:59 +08:00
parent 0482f505a6
commit 255892dd5f
3 changed files with 41 additions and 31 deletions

View File

@ -56,8 +56,7 @@ namespace AlicizaX.UI.Editor
#region Serialized Properties - Templates & Scrollbar
private SerializedProperty _templates;
private SerializedProperty _showScrollBar;
private SerializedProperty _showScrollBarOnlyWhenScrollable;
private SerializedProperty _scrollbarVisibility;
private SerializedProperty _scrollbar;
#endregion
@ -110,8 +109,7 @@ namespace AlicizaX.UI.Editor
private void InitializeTemplateProperties()
{
_templates = serializedObject.FindProperty("templates");
_showScrollBar = serializedObject.FindProperty("showScrollBar");
_showScrollBarOnlyWhenScrollable = serializedObject.FindProperty("showScrollBarOnlyWhenScrollable");
_scrollbarVisibility = serializedObject.FindProperty("scrollbarVisibility");
_scrollbar = serializedObject.FindProperty("scrollbar");
}
@ -354,19 +352,13 @@ namespace AlicizaX.UI.Editor
{
using (new EditorGUI.DisabledScope(isPlaying))
{
bool previousShowScrollBarValue = _showScrollBar.boolValue;
EditorGUILayout.PropertyField(_showScrollBar);
ScrollbarVisibility previousVisibility = (ScrollbarVisibility)_scrollbarVisibility.enumValueIndex;
EditorGUILayout.PropertyField(_scrollbarVisibility, new GUIContent("Scrollbar Visibility"));
ScrollbarVisibility currentVisibility = (ScrollbarVisibility)_scrollbarVisibility.enumValueIndex;
if (_showScrollBar.boolValue != previousShowScrollBarValue)
if (currentVisibility != previousVisibility)
{
HandleScrollBarToggle();
}
if (_showScrollBar.boolValue)
{
EditorGUILayout.PropertyField(
_showScrollBarOnlyWhenScrollable,
new GUIContent("Only When Scrollable", "Hide the scrollbar and disable list scrolling when content does not overflow the viewport."));
HandleScrollBarVisibilityChange(previousVisibility, currentVisibility);
}
}
}
@ -535,22 +527,24 @@ namespace AlicizaX.UI.Editor
#region Scrollbar Handling
private void HandleScrollBarToggle()
private void HandleScrollBarVisibilityChange(ScrollbarVisibility previousVisibility, ScrollbarVisibility currentVisibility)
{
if (_showScrollBar.boolValue)
{
CreateScrollBar();
}
else
if (currentVisibility == ScrollbarVisibility.AlwaysHide)
{
ClearScrollBar();
}
if (previousVisibility == ScrollbarVisibility.AlwaysHide)
{
CreateScrollBar();
}
}
private void CreateScrollBar()
{
var recyclerView = target as RecyclerView;
if (recyclerView == null) return;
if (_scrollbar.objectReferenceValue != null) return;
Direction direction = (Direction)_direction.enumValueIndex;
string prefabPath = GetScrollbarPrefabPath(direction);
@ -589,7 +583,7 @@ namespace AlicizaX.UI.Editor
private void ClearScrollBar()
{
_showScrollBar.boolValue = false;
_scrollbarVisibility.enumValueIndex = (int)ScrollbarVisibility.AlwaysHide;
if (_scrollbar.objectReferenceValue != null)
{

View File

@ -229,4 +229,11 @@ namespace AlicizaX.UI
Center,
Top
}
public enum ScrollbarVisibility
{
AlwaysHide = 0,
AlwaysShow = 1,
WhenScrollable = 2
}
}

View File

@ -87,12 +87,11 @@ namespace AlicizaX.UI
/// <summary>
/// 是否显示滚动条<E58AA8>?
/// </summary>
[HideInInspector] [SerializeField] private bool showScrollBar;
[HideInInspector] [SerializeField] private ScrollbarVisibility scrollbarVisibility;
/// <summary>
/// 是否仅在内容可滚动时显示滚动条<E58AA8>?
/// </summary>
[HideInInspector] [SerializeField] private bool showScrollBarOnlyWhenScrollable;
/// <summary>
/// 与当前列表关联的滚动条组件<E7BB84>?
@ -302,13 +301,13 @@ namespace AlicizaX.UI
/// <summary>
/// 获取或设置是否仅在内容可滚动时显示滚动条<E58AA8>?
/// </summary>
public bool ShowScrollBarOnlyWhenScrollable
public ScrollbarVisibility ScrollbarVisibility
{
get => showScrollBarOnlyWhenScrollable;
get => scrollbarVisibility;
set
{
if (showScrollBarOnlyWhenScrollable == value) return;
showScrollBarOnlyWhenScrollable = value;
if (scrollbarVisibility == value) return;
scrollbarVisibility = value;
RequestLayout();
}
}
@ -688,7 +687,7 @@ namespace AlicizaX.UI
/// </summary>
private void ConfigureScrollbar()
{
if (!showScrollBar || scrollbar == null) return;
if (scrollbarVisibility == ScrollbarVisibility.AlwaysHide || scrollbar == null) return;
scrollbar.onValueChanged.AddListener(OnScrollbarChanged);
@ -1428,7 +1427,17 @@ namespace AlicizaX.UI
/// <returns>应显示滚动条时返<E697B6>?<see langword="true"/>否则返<E58899>?<see langword="false"/><3E>?/returns>
private bool ShouldShowScrollbar()
{
if (!showScrollBar || !scroll || scrollbar == null || scroller == null || layoutManager == null || !SupportsOverflowCheck())
if (scrollbarVisibility == ScrollbarVisibility.AlwaysHide || !scroll || scrollbar == null || scroller == null || layoutManager == null)
{
return false;
}
if (scrollbarVisibility == ScrollbarVisibility.AlwaysShow)
{
return true;
}
if (!SupportsOverflowCheck())
{
return false;
}
@ -1533,7 +1542,7 @@ namespace AlicizaX.UI
/// <returns>需要仅在内容溢出时启用滚动返回 <see langword="true"/>否则返<E58899>?<see langword="false"/><3E>?/returns>
private bool ShouldLimitScrollToOverflow()
{
return showScrollBar && showScrollBarOnlyWhenScrollable && SupportsOverflowCheck();
return scrollbarVisibility == ScrollbarVisibility.WhenScrollable && SupportsOverflowCheck();
}
/// <summary>