跳转到内容

NavigationBar

NavigationBar 是 Miuix 中的底部导航栏组件,用于在应用底部创建导航菜单,支持 2 到 5 个导航项,提供不同的显示模式(仅图标、仅文本、图标和文本、仅选中项显示文本)。

FloatingNavigationBar 是一个悬浮样式的底部导航栏组件,同样支持 2 到 5 个导航项,提供不同的显示模式。

这些组件通常与 Scaffold 组件结合使用,以便在应用程序的不同页面中保持一致的布局和行为。

引入

kotlin
import top.yukonga.miuix.kmp.basic.NavigationBar
import top.yukonga.miuix.kmp.basic.NavigationBarItem
import top.yukonga.miuix.kmp.basic.FloatingNavigationBar
import top.yukonga.miuix.kmp.basic.FloatingNavigationBarItem
import top.yukonga.miuix.kmp.basic.NavigationBarDisplayMode
import top.yukonga.miuix.kmp.basic.FloatingNavigationBarDisplayMode

基本用法

NavigationBar 组件可用于创建固定在底部的导航菜单:

kotlin
var selectedIndex by remember { mutableStateOf(0) }
val items = listOf("首页", "我的", "设置")
val icons = listOf(MiuixIcons.VerticalSplit, MiuixIcons.Contacts, MiuixIcons.Settings)

Scaffold(
    bottomBar = {
        NavigationBar {
            items.forEachIndexed { index, label ->
                NavigationBarItem(
                    selected = selectedIndex == index,
                    onClick = { selectedIndex = index },
                    icon = icons[index],
                    label = label
                )
            }
        }
    }
)

FloatingNavigationBar

FloatingNavigationBar 组件可用于创建悬浮在底部的导航菜单:

kotlin
var selectedIndex by remember { mutableStateOf(0) }
val items = listOf("首页", "我的", "设置")
val icons = listOf(MiuixIcons.VerticalSplit, MiuixIcons.Contacts, MiuixIcons.Settings)

Scaffold(
    bottomBar = {
        FloatingNavigationBar(
            mode = FloatingNavigationBarDisplayMode.IconOnly // 仅显示图标
        ) {
            items.forEachIndexed { index, label ->
                FloatingNavigationBarItem(
                    selected = selectedIndex == index,
                    onClick = { selectedIndex = index },
                    icon = icons[index],
                    label = label
                )
            }
        }
    }
)

组件状态

选中状态

NavigationBarItemFloatingNavigationBarItem 都会自动处理选中项的视觉样式,选中项将显示粗体文本并高亮图标/文本。

属性

属性名类型说明默认值是否必须
modifierModifier应用于导航栏的修饰符Modifier
colorColor导航栏背景颜色MiuixTheme.colorScheme.surface
showDividerBoolean是否显示顶部分割线true
defaultWindowInsetsPaddingBoolean是否应用默认窗口嵌入边距true
modeNavigationBarDisplayMode导航项的显示模式NavigationBarDisplayMode.IconAndText
content@Composable RowScope.()导航栏的内容-
属性名类型说明默认值是否必须
selectedBoolean是否选中-
onClick() -> Unit点击时的回调-
iconImageVector图标-
labelString文本标签-
modifierModifier应用于导航项的修饰符Modifier
enabledBoolean是否启用true

FloatingNavigationBar 属性

属性名类型说明默认值是否必须
modifierModifier应用于导航栏的修饰符Modifier
colorColor导航栏背景颜色MiuixTheme.colorScheme.surfaceContainer
cornerRadiusDp导航栏的圆角半径FloatingToolbarDefaults.CornerRadius
horizontalAlignmentAlignment.Horizontal导航栏在其父容器中的水平对齐方式CenterHorizontally
horizontalOutSidePaddingDp导航栏外部的水平内边距FloatingNavigationBarDefaults.HorizontalOutSidePadding
shadowElevationDp导航栏的阴影高度FloatingNavigationBarDefaults.ShadowElevation
showDividerBoolean是否显示导航栏周围的分割线false
defaultWindowInsetsPaddingBoolean是否应用默认窗口嵌入边距true
modeFloatingNavigationBarDisplayMode导航项的显示模式(图标/文本/两者)FloatingNavigationBarDisplayMode.IconOnly
content@Composable RowScope.()导航栏的内容-

FloatingNavigationBarItem 属性

属性名类型说明默认值是否必须
selectedBoolean是否选中-
onClick() -> Unit点击时的回调-
iconImageVector图标-
labelString文本标签-
modifierModifier应用于导航项的修饰符Modifier
enabledBoolean是否启用true

NavigationBarDefaults 对象提供了 NavigationBar 和 NavigationBarItem 组件的默认值。

常量

常量名类型说明默认值
ItemHeightDp非 iOS 平台的项目高度64.dp
ItemHeightIOSDpiOS 平台的项目高度48.dp
IconSizeDp图标尺寸26.dp
LabelFontSizeTextUnit标签字号12.sp
IconTopPaddingDp图标顶部内边距8.dp
BottomPaddingDp标签底部内边距8.dp
SelectedPressedAlphaFloat选中项按压时的透明度0.5f
UnselectedPressedAlphaFloat未选中项按压时的透明度0.6f
UnselectedAlphaFloat未选中项的透明度0.4f

FloatingNavigationBarDefaults 对象

FloatingNavigationBarDefaults 对象提供了 FloatingNavigationBar 和 FloatingNavigationBarItem 组件的默认值。

常量

常量名类型说明默认值
HorizontalOutSidePaddingDp外部水平内边距36.dp
ShadowElevationDp阴影高度1.dp
HorizontalPaddingDp内部水平内边距12.dp
ItemSpacingDp项目间距12.dp
IconSizeDp图标尺寸(IconAndText 模式)24.dp
LabelFontSizeTextUnit标签字号(IconAndText 模式)12.sp
VerticalPaddingDp垂直内边距(IconAndText 模式)6.dp
TextVerticalPaddingDp垂直内边距(TextOnly 模式)16.dp
TextHorizontalPaddingDp水平内边距(TextOnly 模式)2.dp
TextFontSizeTextUnit字号(TextOnly 模式)14.sp
IconOnlySizeDp图标尺寸(IconOnly 模式)28.dp
IconOnlyPaddingDp内边距(IconOnly 模式)10.dp
SelectedPressedAlphaFloat选中项按压时的透明度0.5f
UnselectedPressedAlphaFloat未选中项按压时的透明度0.6f
UnselectedAlphaFloat未选中项的透明度0.4f
说明
IconAndText显示图标和文本
IconOnly仅显示图标
TextOnly仅显示文本
IconWithSelectedLabel始终显示图标,仅选中时显示文本

FloatingNavigationBarDisplayMode 枚举

说明
IconAndText显示图标和文本
IconOnly仅显示图标
TextOnly仅显示文本

进阶用法

自定义颜色

kotlin
NavigationBar(
    color = Color.Red.copy(alpha = 0.3f)
) {
    // ... items ...
}

无分割线

kotlin
NavigationBar(
    showDivider = false
) {
    // ... items ...
}

处理窗口边距

kotlin
NavigationBar(
    defaultWindowInsetsPadding = false // 自行处理窗口嵌入边距
) {
    // ... items ...
}

FloatingNavigationBar

自定义模式(图标和文本)

kotlin
FloatingNavigationBar(
    mode = FloatingNavigationBarDisplayMode.IconAndText
) {
    // ... items ...
}

自定义模式(仅文本)

kotlin
FloatingNavigationBar(
    mode = FloatingNavigationBarDisplayMode.TextOnly
) {
    // ... items ...
}

自定义颜色和圆角

kotlin
FloatingNavigationBar(
    color = MiuixTheme.colorScheme.primaryContainer,
    cornerRadius = 28.dp,
    mode = FloatingNavigationBarDisplayMode.IconAndText
) {
    // ... items ...
}

自定义对齐和边距

kotlin
FloatingNavigationBar(
    horizontalAlignment = Alignment.Start, // 左对齐
    horizontalOutSidePadding = 16.dp, // 设置外部边距
    mode = FloatingNavigationBarDisplayMode.IconOnly
) {
    // ... items ...
}

结合页面切换使用(使用脚手架)

使用 NavigationBar

kotlin
val pages = listOf("首页", "我的", "设置")
val icons = listOf(MiuixIcons.VerticalSplit, MiuixIcons.Contacts, MiuixIcons.Settings)
var selectedIndex by remember { mutableStateOf(0) }

Scaffold(
    bottomBar = {
        NavigationBar {
            pages.forEachIndexed { index, label ->
                NavigationBarItem(
                    selected = selectedIndex == index,
                    onClick = { selectedIndex = index },
                    icon = icons[index],
                    label = label
                )
            }
        }
    }
) { paddingValues ->
    // 内容区域需要考虑 padding
    Box(
        modifier = Modifier
            .fillMaxSize()
            .padding(paddingValues),
        contentAlignment = Alignment.Center
    ) {
        Text(
            text = "当前页面:${pages[selectedIndex]}",
            style = MiuixTheme.textStyles.title1
        )
    }
}

使用 FloatingNavigationBar

kotlin
val pages = listOf("首页", "我的", "设置")
val icons = listOf(MiuixIcons.VerticalSplit, MiuixIcons.Contacts, MiuixIcons.Settings)
var selectedIndex by remember { mutableStateOf(0) }

Scaffold(
    bottomBar = {
        FloatingNavigationBar(
            mode = FloatingNavigationBarDisplayMode.IconOnly // 仅显示图标
        ) {
            pages.forEachIndexed { index, label ->
                FloatingNavigationBarItem(
                    selected = selectedIndex == index,
                    onClick = { selectedIndex = index },
                    icon = icons[index],
                    label = label
                )
            }
        }
    }
) { paddingValues ->
    // 内容区域需要考虑 padding
    Box(
        modifier = Modifier
            .fillMaxSize()
            .padding(paddingValues),
        contentAlignment = Alignment.Center
    ) {
        Text(
            text = "当前页面:${pages[selectedIndex]}",
            style = MiuixTheme.textStyles.title1
        )
    }
}

变更日志

基于 Apache-2.0 许可发布