我正在研究一种使我的粘性标题具有透明背景的方法,这是因为我的背景有渐变,我需要标题具有透明背景。
@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 组件,我知道它是实验性的,但是,有没有办法让项目在拖动时不会显示在后面,而是剪切某种盒装内容?
据我所知,
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)
}
}
}
}