MotionLayout自定義開關(guān)按鈕實(shí)例詳解
MotionLayout自定義一個(gè)動(dòng)畫開關(guān)按鈕
MotionLayout是一個(gè)非常新的類,它來(lái)自ConstraintLayout 2.0庫(kù)中,主要目的是為了幫助Android開發(fā)人員在應(yīng)用中降低使用手勢(shì)和組件動(dòng)畫的難度

使用方法
MotionSwitch(Modifier.height(26.dp).width(86.dp), onText = "最熱", offText = "最新", onEvent = {
}, offEvent = {
})
完整代碼直接拿去用
import androidx.compose.animation.core.animateFloatAsState
import androidx.compose.animation.core.tween
import androidx.compose.foundation.background
import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.*
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material3.Text
import androidx.compose.runtime.*
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.layout.layoutId
import androidx.compose.ui.layout.onSizeChanged
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.unit.IntSize
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import androidx.constraintlayout.compose.ConstraintSet
import androidx.constraintlayout.compose.ExperimentalMotionApi
import androidx.constraintlayout.compose.MotionLayout
import kotlin.math.roundToInt
/**
* @Description:
* @Author: JIULANG
* @Data: 2022/11/6 16:27
*/
@ExperimentalMotionApi
@Composable
fun MotionSwitch(
modifier:Modifier =Modifier,
check:Boolean =false,
onText:String = "on",
offText:String = "off",
onEvent :()-> Unit,
offEvent :()-> Unit,
) {
var animateToEnd by remember { mutableStateOf(check) }
val progress by animateFloatAsState(
targetValue = if (animateToEnd) 1f else 0f,
animationSpec = tween(1000)
)
var buttonSwitchHight by remember { mutableStateOf(IntSize(0, 0)) }
Column() {
MotionLayout(
ConstraintSet(
""" {
backgroundSwitch: {
custom: {
color: "#d2d2d2"
}
},
buttonSwitch: {
top: ['backgroundSwitch', 'top', 0],
start: ['backgroundSwitch', 'start', 0]
},
on: {
top: ['backgroundSwitch', 'top', 0],
start: ['backgroundSwitch', 'start', 0],
bottom: ['backgroundSwitch', 'bottom', 0]
},
off: {
top: ['backgroundSwitch', 'top', 0],
end: ['backgroundSwitch', 'end', 0],
bottom: ['backgroundSwitch', 'bottom', 0]
}
}"""
),
ConstraintSet(
""" {
backgroundSwitch: {
custom: {
color: "#343434"
}
},
buttonSwitch: {
top: ['backgroundSwitch', 'top', 0],
end: ['backgroundSwitch', 'end', 0]
},
on: {
top: ['backgroundSwitch', 'top', 0],
start: ['backgroundSwitch', 'start', 0],
bottom: ['backgroundSwitch', 'bottom', 0]
},
off: {
top: ['backgroundSwitch', 'top', 0],
end: ['backgroundSwitch', 'end', 0],
bottom: ['backgroundSwitch', 'bottom', 0]
}
}"""
),
progress = progress,
modifier =modifier
) {
Box(
modifier = modifier
.layoutId("backgroundSwitch")
.clip(RoundedCornerShape(36.dp))
.onSizeChanged {
buttonSwitchHight = it
}
.clickable(onClick = {
if (animateToEnd){
onEvent.invoke()
}else{
offEvent.invoke()
}
animateToEnd = !animateToEnd })
.background(motionProperties("backgroundSwitch").value.color("color"))
)
Box(
modifier = Modifier
.height(buttonSwitchHight.height.dp)
.width((buttonSwitchHight.width/5).dp)
.layoutId("buttonSwitch")
.clip(RoundedCornerShape(36.dp))
.background(Color.Gray)
)
Text(
text = onText,
modifier = Modifier
.layoutId("on")
.width((buttonSwitchHight.width/5).dp),
color = Color.White,
fontSize = 12.sp,
textAlign = TextAlign.Center
)
Text(
text = offText,
modifier = Modifier
.layoutId("off")
.width((buttonSwitchHight.width/5).dp),
color = Color.White,
fontSize = 12.sp,
textAlign = TextAlign.Center
)
}
}
}以上就是MotionLayout自定義開關(guān)按鈕實(shí)例詳解的詳細(xì)內(nèi)容,更多關(guān)于MotionLayout自定義開關(guān)按鈕的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Android自定義ListView實(shí)現(xiàn)下拉刷新
這篇文章主要為大家詳細(xì)介紹了Android自定義ListView實(shí)現(xiàn)下拉刷新的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-07-07
Android中AnimationDrawable使用的簡(jiǎn)單實(shí)例
這篇文章介紹了Android中AnimationDrawable使用的簡(jiǎn)單實(shí)例,有需要的朋友可以參考一下2013-10-10
Android自定義頂部導(dǎo)航欄控件實(shí)例代碼
這篇文章主要介紹了Android自定義頂部導(dǎo)航欄控件實(shí)例代碼,需要的朋友可以參考下2017-12-12
Android利用ZXing掃描二維碼的實(shí)例代碼解析
這篇文章主要介紹了Android利用ZXing掃描二維碼的實(shí)例解析,代碼簡(jiǎn)單易懂,非常不錯(cuò),需要的朋友可以參考下2016-12-12
Android Map數(shù)據(jù)結(jié)構(gòu)全面總結(jié)分析
這篇文章主要為大家介紹了Android Map數(shù)據(jù)結(jié)構(gòu)全面總結(jié)分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-12-12
Android Studio 升級(jí)到3.0 提示 java.lang.NoClassDefFoundError的解決方法
這篇文章主要介紹了Android Studio 升級(jí)到3.0 提示 java.lang.NoClassDefFoundError的解決方法,需要的朋友可以參考下2017-12-12

