android - 如何在 Jetpack Compose 中使用图标切换按钮?
问题描述
我想在 Jetpack Compose 中使用图标按钮,但我无法理解 Jetpack Compose 文档。有人可以分享与此类似的切换按钮的示例代码吗?
当用户单击一个按钮时,我想像在 Instagram 中一样使用弹跳动画对其进行动画处理。
解决方案
您可以将IconToggleButton与转换结合使用。示例代码(使用版本 1.0.0-beta05):
import android.annotation.SuppressLint
import androidx.compose.animation.animateColor
import androidx.compose.animation.core.*
import androidx.compose.foundation.layout.*
import androidx.compose.material.*
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.*
import androidx.compose.runtime.*
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp
@SuppressLint("UnusedTransitionTargetStateParameter")
@Composable
fun FavoriteButton(
isChecked: Boolean,
onClick: () -> Unit
) {
IconToggleButton(
checked = isChecked,
onCheckedChange = { onClick() }
) {
val transition = updateTransition(isChecked, label = "Checked indicator")
val tint by transition.animateColor(
label = "Tint"
) { isChecked ->
if (isChecked) Color.Red else Color.Black
}
val size by transition.animateDp(
transitionSpec = {
if (false isTransitioningTo true) {
keyframes {
durationMillis = 250
30.dp at 0 with LinearOutSlowInEasing // for 0-15 ms
35.dp at 15 with FastOutLinearInEasing // for 15-75 ms
40.dp at 75 // ms
35.dp at 150 // ms
}
} else {
spring(stiffness = Spring.StiffnessVeryLow)
}
},
label = "Size"
) { 30.dp }
Icon(
imageVector = if (isChecked) Icons.Filled.Favorite else Icons.Filled.FavoriteBorder,
contentDescription = null,
tint = tint,
modifier = Modifier.size(size)
)
}
}
@Preview("Favorite Button")
@Composable
fun FavoriteButtonPreview() {
val (isChecked, setChecked) = remember { mutableStateOf(false) }
MaterialTheme {
Surface {
FavoriteButton(
isChecked = isChecked,
onClick = { setChecked(!isChecked) }
)
}
}
}
这些是此示例所需的依赖项:
dependencies {
implementation 'androidx.core:core-ktx:1.6.0-alpha01'
implementation "androidx.compose.ui:ui:1.0.0-beta05"
implementation "androidx.compose.material:material:1.0.0-beta05"
implementation "androidx.compose.ui:ui-tooling:1.0.0-beta05"
implementation 'androidx.activity:activity-compose:1.3.0-alpha06'
}
有关自定义它们的更多详细信息transition
和keyframes
方法,请参阅 Compose 的动画文档。
推荐阅读
- list - 如何在 SwiftUI 中删除单行列表中的分隔符?
- laravel - npm run watch 在 laravel 中显示错误
- php - Pdf Mrged文件shell_exec()不工作aws服务器
- reactjs - 禁用反应js中的链接
- javascript - 如何在 Node.js 中转换数组并传递这些数据
- azure - Azure Blob CONTENT-MD 对于某些文件为空
- python - 如何创建多页 Dash App 的 PDF 视图?
- python - 使用值列表查询 GraphQL
- ios - onAppear 不允许保存/更新选择器值的更改?
- cpu-architecture - 如何判断真值表是否有错?