透明的粘性标题显示后面的项目

问题描述 投票:0回答:1

我正在研究一种使我的粘性标题具有透明背景的方法,这是因为我的背景有渐变,我需要标题具有透明背景。

可重现的示例

@OptIn(ExperimentalFoundationApi::class)
@Composable
fun Example() {
    Box(
        Modifier.fillMaxSize()
            .drawBackgroundGradient()
            .clipToBounds()
    ) {
        LazyColumn {
            stickyHeader {
                Column(
                    modifier = Modifier
                        .fillMaxWidth()
                        .background(Color.Transparent)
                        .padding(top = 16.dp, bottom = 16.dp)
                ) {
                    Card(
                        modifier = Modifier.fillMaxWidth(),
                        border = BorderStroke(1.dp, Color.Gray),
                        shape = RoundedCornerShape(20.dp),
                        colors = CardDefaults.cardColors(containerColor = TransparentBackground)
                    ) {
                        Row(
                            modifier = Modifier.padding(12.dp),
                            verticalAlignment = Alignment.CenterVertically
                        ) {

                            Icon(
                                modifier = Modifier.padding(end = 16.dp),
                                painter = rememberVectorPainter(Icons.Filled.Warning),
                                contentDescription = "Disclaimer icon",
                                tint = Color.Yellow
                            )

                            Text(
                                text = "Test copy text of banner",
                                style = TS_Helvetica_400.copy(
                                    lineHeight = 15.sp
                                ),
                                fontSize = 14.sp,
                                color = Color.White
                            )
                        }

                    }

                }
            }
            items(fakeList) { item ->
                Text(modifier = Modifier.fillMaxWidth(), text = item, color = Color.White)
            }
        }
    }
}

val baseList = listOf("name 1", "name 2", "name 3")

// Create a list of 100 elements by repeating baseList
val fakeList = List(100 / baseList.size) { baseList }.flatten() + baseList.take(100 % baseList.size)

fun Modifier.drawBackgroundGradient(): Modifier {
    return this.drawBehind {
        val gradientColors =
            listOf(Color(0xFF6A66FF).copy(alpha = 0.2f), Color.Transparent)

        // Draw the background color
        drawRect(color = Color.Black)

        // Draw the first radial gradient circle
        drawCircle(
            brush = Brush.radialGradient(
                colors = gradientColors,
                center = Offset(size.width * 0.1f, size.height * 0.5f),
                radius = 800.dp.toPx()
            ),
            radius = 800.dp.toPx(),
            center = Offset(size.width * 0.1f, size.height * 0.5f)
        )

        // Draw the second radial gradient circle
        drawCircle(
            brush = Brush.radialGradient(
                colors = gradientColors,
                center = Offset(size.width * 0.9f, size.height * 0.9f),
                radius = 500.dp.toPx()
            ),
            radius = 500.dp.toPx(),
            center = Offset(size.width * 0.9f, size.height * 0.9f)
        )
    }
}

我一直在尝试一些解决方法,但它们不包括 StickyHeader 组件,我知道它是实验性的,但是,有没有办法让项目在拖动时不会显示在后面,而是剪切某种盒装内容?

android kotlin android-jetpack-compose
1个回答
0
投票

据我所知,

LazyColumn
总是会滚动
stickyHeader
后面的项目。为了防止这种情况,您可以将标头分开,并将其与
LazyColumn
一起包装在
Column
中。

这是更新后的代码:

@Composable
fun Example() {
Column(
    Modifier
        .fillMaxSize()
        .drawBackgroundGradient()
        .clipToBounds()
) {
    Column(
        modifier = Modifier
            .fillMaxWidth()
            .background(Color.Transparent)
            .padding(top = 16.dp, bottom = 16.dp)
    ) {
        Card(
            modifier = Modifier.fillMaxWidth(),
            border = BorderStroke(1.dp, Color.Gray),
            shape = RoundedCornerShape(20.dp),
            colors = CardDefaults.cardColors(containerColor = Color.Transparent)
        ) {
            Row(
                modifier = Modifier.padding(12.dp),
                verticalAlignment = Alignment.CenterVertically
            ) {

                Icon(
                    modifier = Modifier.padding(end = 16.dp),
                    painter = rememberVectorPainter(Icons.Filled.Warning),
                    contentDescription = "Disclaimer icon",
                    tint = Color.Yellow
                )

                Text(
                    text = "Test copy text of banner",
                    fontSize = 14.sp,
                    color = Color.White
                )
            }

        }

    }
    LazyColumn(modifier = Modifier.weight(1f)) {
        items(fakeList) { item ->
            Text(modifier = Modifier.fillMaxWidth(), text = item, color = Color.White)
        }
    }
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.