这篇文章主要介绍了如何利用JetpackCompose实现双击点赞动画效果,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
实现步骤
先红色画个爱心
Icon(
Icons.Filled.Favorite,
"爱心",
Modifier
.align(Alignment.Center)
tint = Color.Red
)
点击事件加动画
双击监听
.pointerInput(Unit) {
detectTapGestures(
onDoubleTap = {
...
}
)
}
#### **API 介绍**
| API名称 | 作用 |
| --- | --- |
| detectTapGestures | 监听点击手势 |
> 与 Clickable Modifier 不同的是,detectTapGestures 可以监听更多的点击事件。作为手机监听的基础 API,必然不会存在 Clickable Modifier 所拓展的涟漪效果
detectTapGestures 提供了四个可选参数
- onDoubleTap (可选):双击时回调
- onLongPress (可选):长按时回调
- onPress (可选):按下时回调
- onTap (可选):轻触时回调
我们用到的就是`onDoubleTap`
用枚举定义三个变量 开始、显示和消失
enum class LikedStates {
Initial,
Liked,
Disappeared
}
remember保持数据状态,mutableStateOf监听状态变化
var transitionState by remember {
mutableStateOf(MutableTransitionState(LikedStates.Disappeared))
}
MutableTransitionState包含两个字段:currentState和targetState。currentState初始化为提供的initialState,并且只能通过转换进行变异。targetState也初始化为initialState。可以对其进行变异,以改变使用updateTransition使用MutableTransitionState创建的过渡动画的过程。currentState和targetState都由状态对象支持。
判断拦截数据变化过程,用于实现对应的动画
if (transitionState.currentState == LikedStates.Initial) {
transitionState.targetState = LikedStates.Liked
} else if (transitionState.currentState == LikedStates.Liked) {
transitionState.targetState = LikedStates.Disappeared
}
开始显示的过度动画
val transition = updateTransition(transitionState = transitionState, label = null)
val alpha by transition.animateFloat(
transitionSpec = {
...
}
) {
if (it == LikedStates.Liked) 1f else 0f
}
我们要实现有弹性的放大动画,所以利用graphicsLayer实现缩放
graphicsLayer可以应用于
- 缩放(
scaleX
、scaleY
) - 旋转(rotationX、rotationY、rotationZ)
- 不透明度(
alpha
) - 阴影(shadowElevation、shape)
- 剪裁(clip、shape)
定义scale,XY
1 :1放大所以定义一个就行
val scale by transition.animateFloat(
transitionSpec = {
....
}
) {
...
}
创建浮动动画作为给定变换的一部分targetValueByState
用作从目标状态到此动画的目标值的映射
最后在定义三种状态里吗设置对应的参数
when (it) {
LikedStates.Initial -> 0f
LikedStates.Liked -> 4f
LikedStates.Disappeared -> 2f
}
完整代码
@Suppress("TransitionPropertiesLabel")
@Composable
fun DoubleTapToLike() {
var transitionState by remember {
mutableStateOf(MutableTransitionState(LikedStates.Disappeared))
}
Box(
Modifier
.fillMaxSize()
.pointerInput(Unit) {
detectTapGestures(
onDoubleTap = {
transitionState = MutableTransitionState(LikedStates.Initial)
}
)
}
) {
if (transitionState.currentState == LikedStates.Initial) {
transitionState.targetState = LikedStates.Liked
} else if (transitionState.currentState == LikedStates.Liked) {
transitionState.targetState = LikedStates.Disappeared
}
val transition = updateTransition(transitionState = transitionState, label = null)
val alpha by transition.animateFloat(
transitionSpec = {
when {
LikedStates.Initial isTransitioningTo LikedStates.Liked ->
keyframes {
durationMillis = 500
0f at 0
0.5f at 100
1f at 225
}
LikedStates.Liked isTransitioningTo LikedStates.Disappeared ->
tween(durationMillis = 200)
else -> snap()
}
}
) {
if (it == LikedStates.Liked) 1f else 0f
}
val scale by transition.animateFloat(
transitionSpec = {
when {
LikedStates.Initial isTransitioningTo LikedStates.Liked ->
spring(dampingRatio = Spring.DampingRatioHighBouncy)
LikedStates.Liked isTransitioningTo LikedStates.Disappeared ->
tween(200)
else -> snap()
}
}
) {
when (it) {
LikedStates.Initial -> 0f
LikedStates.Liked -> 4f
LikedStates.Disappeared -> 2f
}
}
Icon(
Icons.Filled.Favorite,
"点赞",
Modifier
.align(Alignment.Center)
.graphicsLayer(
alpha = alpha,
scaleX = scale,
scaleY = scale
),
tint = Color.Red
)
}
}
enum class LikedStates {
Initial,
Liked,
Disappeared
}
效果图
到此这篇关于通过Jetpack Compose实现双击点赞动画效果的文章就介绍到这了,更多相关Jetpack Compose内容请搜索编程学习网以前的文章希望大家以后多多支持编程学习网!
本文标题为:通过Jetpack Compose实现双击点赞动画效果


基础教程推荐
- MVVMLight项目Model View结构及全局视图模型注入器 2023-05-07
- iOS开发 全机型适配解决方法 2023-01-14
- iOS开发使用XML解析网络数据 2022-11-12
- Android开发Compose集成高德地图实例 2023-06-15
- Flutter进阶之实现动画效果(三) 2022-10-28
- Android Compose自定义TextField实现自定义的输入框 2023-05-13
- Android实现短信验证码输入框 2023-04-29
- IOS获取系统相册中照片的示例代码 2023-01-03
- iOS中如何判断当前网络环境是2G/3G/4G/5G/WiFi 2023-06-18
- iOS Crash常规跟踪方法及Bugly集成运用详细介绍 2023-01-18