Jetpack compose之自定义TopBar

Jetpack compose之自定义TopBar

前言

最近在开发一个音乐软件,想着用Jetpack compose进行编写,于是就自己定义了一个TopBar

效果图

我们先看一下效果图
TopBar

代码

import androidx.compose.foundation.layout.*
import androidx.compose.material.*
import androidx.compose.material.SnackbarDefaults.backgroundColor
import androidx.compose.runtime.Composable
import androidx.compose.runtime.CompositionLocalProvider
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.dp

/**
 * 主界面topBar
 * @param modifier Modifier
 * @param title [@androidx.compose.runtime.Composable] Function0<Unit>
 * @param icon [@androidx.compose.runtime.Composable] Function0<Unit>?
 * @param more [@androidx.compose.runtime.Composable] Function0<Unit>? 更多操作,一般建议在3个左右
 * @param backgroundColor Color
 * @param contentColor Color
 * @param contentPadding PaddingValues
 * @param elevation Dp
 */
@Composable
fun MainActivityTopBar(
    modifier: Modifier = Modifier,
    title:@Composable () -> Unit = {},
    icon:@Composable (() -> Unit)? = null,
    more:@Composable (() -> Unit)? = null,
    backgroundColor: Color = MaterialTheme.colors.primarySurface,
    contentColor: Color = contentColorFor(backgroundColor),
    contentPadding:PaddingValues = AppBarDefaults.ContentPadding,
    elevation: Dp = AppBarDefaults.TopAppBarElevation
){
    TopBar(
        contentColor,
        contentPadding,
        elevation,
        modifier
    ){
        if (icon == null) {
            Spacer(TitleInsetWithoutIcon)
        } else {
            Row(TitleIconModifier, verticalAlignment = Alignment.CenterVertically) {
                CompositionLocalProvider(
                    LocalContentAlpha provides ContentAlpha.high,
                    content = icon
                )
            }
        }

        Row(
            Modifier.fillMaxHeight().weight(1f),
            verticalAlignment = Alignment.CenterVertically
        ) {
            ProvideTextStyle(value = MaterialTheme.typography.h6) {
                CompositionLocalProvider(
                    LocalContentAlpha provides ContentAlpha.high,
                    content = title
                )
            }
        }

        if(more!=null){
            Row(
                Modifier.fillMaxHeight().weight(1f).wrapContentWidth(Alignment.End),
                verticalAlignment = Alignment.CenterVertically
            ) {
                CompositionLocalProvider(
                    LocalContentAlpha provides ContentAlpha.high,
                    content = more
                )
            }
        }
    }
}

@Composable
private fun TopBar(
    contentColor: Color,
    contentPadding:PaddingValues,
    elevation: Dp,
    modifier: Modifier,
    content: @Composable RowScope.() -> Unit
){
    Surface(
        color = backgroundColor,
        contentColor = contentColor,
        elevation = elevation,
        shape = androidx.compose.ui.graphics.RectangleShape,
        modifier = modifier
    ) {
        Row(Modifier.fillMaxWidth()
            .padding(contentPadding)
            .height(AppBarHeight),
            horizontalArrangement = Arrangement.Start,
            verticalAlignment = Alignment.CenterVertically,
            content = content)
    }
}

private val AppBarHeight = 56.dp
private val AppBarHorizontalPadding = 4.dp
private val TitleInsetWithoutIcon = Modifier.width(16.dp - AppBarHorizontalPadding)
private val TitleIconModifier = Modifier.fillMaxHeight()
    .width(72.dp - AppBarHorizontalPadding)
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码上夏雨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值