通過Jetpack Compose實現(xiàn)雙擊點贊動畫效果
實現(xiàn)步驟
先紅色畫個愛心
Icon(
Icons.Filled.Favorite,
"愛心",
Modifier
.align(Alignment.Center)
tint = Color.Red
)點擊事件加動畫
雙擊監(jiān)聽
.pointerInput(Unit) {
detectTapGestures(
onDoubleTap = {
...
}
)
}
#### **API 介紹**
| API名稱 | 作用 |
| --- | --- |
| detectTapGestures | 監(jiān)聽點擊手勢 |
> 與 Clickable Modifier 不同的是,detectTapGestures 可以監(jiān)聽更多的點擊事件。作為手機(jī)監(jiān)聽的基礎(chǔ) API,必然不會存在 Clickable Modifier 所拓展的漣漪效果
detectTapGestures 提供了四個可選參數(shù)
- onDoubleTap (可選):雙擊時回調(diào)
- onLongPress (可選):長按時回調(diào)
- onPress (可選):按下時回調(diào)
- onTap (可選):輕觸時回調(diào)
我們用到的就是`onDoubleTap`用枚舉定義三個變量 開始、顯示和消失
enum class LikedStates {
Initial,
Liked,
Disappeared
}remember保持?jǐn)?shù)據(jù)狀態(tài),mutableStateOf監(jiān)聽狀態(tài)變化
var transitionState by remember {
mutableStateOf(MutableTransitionState(LikedStates.Disappeared))
}MutableTransitionState包含兩個字段:currentState和targetState。currentState初始化為提供的initialState,并且只能通過轉(zhuǎn)換進(jìn)行變異。targetState也初始化為initialState。可以對其進(jìn)行變異,以改變使用updateTransition使用MutableTransitionState創(chuàng)建的過渡動畫的過程。currentState和targetState都由狀態(tài)對象支持。
判斷攔截數(shù)據(jù)變化過程,用于實現(xiàn)對應(yīng)的動畫
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
}我們要實現(xiàn)有彈性的放大動畫,所以利用graphicsLayer實現(xiàn)縮放
graphicsLayer可以應(yīng)用于
- 縮放(
scaleX、scaleY) - 旋轉(zhuǎn)(rotationX、rotationY、rotationZ)
- 不透明度(
alpha) - 陰影(shadowElevation、shape)
- 剪裁(clip、shape)
定義scale,XY
1 :1放大所以定義一個就行
val scale by transition.animateFloat(
transitionSpec = {
....
}
) {
...
}創(chuàng)建浮動動畫作為給定變換的一部分targetValueByState用作從目標(biāo)狀態(tài)到此動畫的目標(biāo)值的映射
最后在定義三種狀態(tài)里嗎設(shè)置對應(yīng)的參數(shù)
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
}效果圖

到此這篇關(guān)于通過Jetpack Compose實現(xiàn)雙擊點贊動畫效果的文章就介紹到這了,更多相關(guān)Jetpack Compose內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Android使用Spinner控件實現(xiàn)下拉列表的案例
今天小編就為大家分享一篇關(guān)于Android使用Spinner控件實現(xiàn)下拉列表的案例,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2019-03-03
Android逆向入門之常見Davlik字節(jié)碼解析
Dalvik是Google公司自己設(shè)計用于Android平臺的虛擬機(jī)。Dalvik虛擬機(jī)是Google等廠商合作開發(fā)的Android移動設(shè)備平臺的核心組成部分之一,本篇文章我們來詳細(xì)解釋常見Davlik字節(jié)碼2021-11-11
Android帶進(jìn)度條的下載圖片示例(AsyncTask異步任務(wù))
本文主要介紹Android帶進(jìn)度條的下載圖片示例(AsyncTask異步任務(wù))的方法解析。具有很好的參考價值。下面跟著小編一起來看下吧2017-04-04
Android開發(fā)之Picasso通過URL獲取用戶頭像的圓形顯示
這篇文章主要介紹了android開發(fā)之Picasso通過URL獲取用戶頭像的圓形顯示,非常不錯,具有參考借鑒價值,需要的朋友可以參考下2017-06-06
android 實現(xiàn)APP中改變頭像圖片的實例代碼
這篇文章主要介紹了android 實現(xiàn)APP中改變頭像圖片的實例代碼,本文通過實例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下2019-07-07

