Ren*_*ivy 1 android android-jetpack-compose
我需要创建一个具有两种性别状态的开关 - 男人和女人。我尝试创建一排两个按钮,但这样的组件不支持切换之间的动画

正如我所说,我尝试创建一排两个按钮,并创建一个常规 Switch 组件,但 Switch 存在问题,因为它不允许将字符串常量接受到其主体中,并且无法调整大小
你可以这样做。要添加阴影,您可以在 Row 项目后面使用 Box,
BlendMode 用于实现流体和部分文本颜色变化。您可以在这些答案中看到文本颜色如何变化
Jetpack Compose Canvas drawText 颜色混合?
fun ContentDrawScope.drawWithLayer(block: ContentDrawScope.() -> Unit) {
with(drawContext.canvas.nativeCanvas) {
val checkPoint = saveLayer(null, null)
block()
restoreToCount(checkPoint)
}
}
@Composable
private fun TextSwitch(
modifier: Modifier = Modifier,
selectedIndex: Int,
items: List<String>,
onSelectionChange: (Int) -> Unit
) {
BoxWithConstraints(
modifier
.padding(8.dp)
.height(56.dp)
.clip(RoundedCornerShape(8.dp))
.background(Color(0xfff3f3f2))
.padding(8.dp)
) {
if (items.isNotEmpty()) {
val maxWidth = this.maxWidth
val tabWidth = maxWidth / items.size
val indicatorOffset by animateDpAsState(
targetValue = tabWidth * selectedIndex,
animationSpec = tween(durationMillis = 250, easing = FastOutSlowInEasing),
label = "indicator offset"
)
// This is for shadow layer matching white background
Box(
modifier = Modifier
.offset(x = indicatorOffset)
.shadow(4.dp, RoundedCornerShape(8.dp))
.width(tabWidth)
.fillMaxHeight()
)
Row(modifier = Modifier
.fillMaxWidth()
.drawWithContent {
// This is for setting black tex while drawing on white background
val padding = 8.dp.toPx()
drawRoundRect(
topLeft = Offset(x = indicatorOffset.toPx() + padding, padding),
size = Size(size.width / 2 - padding * 2, size.height - padding * 2),
color = Color.Black,
cornerRadius = CornerRadius(x = 8.dp.toPx(), y = 8.dp.toPx()),
)
drawWithLayer {
drawContent()
// This is white top rounded rectangle
drawRoundRect(
topLeft = Offset(x = indicatorOffset.toPx(), 0f),
size = Size(size.width / 2, size.height),
color = Color.White,
cornerRadius = CornerRadius(x = 8.dp.toPx(), y = 8.dp.toPx()),
blendMode = BlendMode.SrcOut
)
}
}
) {
items.forEachIndexed { index, text ->
Box(
modifier = Modifier
.width(tabWidth)
.fillMaxHeight()
.clickable(
interactionSource = remember {
MutableInteractionSource()
},
indication = null,
onClick = {
onSelectionChange(index)
}
),
contentAlignment = Alignment.Center
) {
Text(
text = text,
fontSize = 20.sp,
color = Color.Gray
)
}
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
演示
@Preview
@Composable
private fun TextSwitchTest() {
val items = remember {
listOf("Man", "Woman")
}
var selectedIndex by remember {
mutableStateOf(0)
}
Column {
TextSwitch(
selectedIndex = selectedIndex,
items = items,
onSelectionChange = {
selectedIndex = it
}
)
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
731 次 |
| 最近记录: |