MotionLayout自定義開關(guān)按鈕實(shí)例詳解
MotionLayout自定義一個(gè)動(dòng)畫開關(guān)按鈕
MotionLayout是一個(gè)非常新的類,它來自ConstraintLayout 2.0庫中,主要目的是為了幫助Android開發(fā)人員在應(yīng)用中降低使用手勢和組件動(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上實(shí)現(xiàn)HttpServer的示例代碼
本篇文章主要介紹了在Android上實(shí)現(xiàn)HttpServer的示例代碼,實(shí)現(xiàn)Android本地的微型服務(wù)器,具有一定的參考價(jià)值,有興趣的可以了解一下2017-08-08
Android中TabLayout結(jié)合ViewPager實(shí)現(xiàn)頁面切換效果
這篇文章主要介紹了Android中TabLayout結(jié)合ViewPager實(shí)現(xiàn)頁面切換效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-10-10
自定義RadioButton和ViewPager實(shí)現(xiàn)TabHost帶滑動(dòng)的頁卡效果
在工作中又很多需求都不是android系統(tǒng)自帶的控件可以達(dá)到效果的所以這個(gè)時(shí)候就要自定義控件來達(dá)到效果:使用自定義RadioButton和ViewPager實(shí)現(xiàn)TabHost帶滑動(dòng)的頁卡效果2013-01-01
Android Studio使用小技巧:布局預(yù)覽時(shí)填充數(shù)據(jù)
這篇文章主要介紹了Android Studio使用小技巧:布局預(yù)覽時(shí)填充數(shù)據(jù),本文給出了代碼操作實(shí)例和效果圖例,需要的朋友可以參考下2015-05-05
Android 微信小視頻錄制功能實(shí)現(xiàn)詳細(xì)介紹
這篇文章主要介紹了Android 微信小視頻錄制功能實(shí)現(xiàn)詳解的相關(guān)資料,這里提供了具體的實(shí)現(xiàn)思路及代碼,需要的朋友可以參考下2016-11-11
Android Notification使用方法總結(jié)
這篇文章主要介紹了Android Notification使用方法總結(jié)的相關(guān)資料,這里提供了四種使用方法,需要的朋友可以參考下2017-09-09
android使用OkHttp實(shí)現(xiàn)下載的進(jìn)度監(jiān)聽和斷點(diǎn)續(xù)傳
本篇文章主要介紹了android使用OkHttp實(shí)現(xiàn)下載的進(jìn)度監(jiān)聽和斷點(diǎn)續(xù)傳,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。2017-02-02
Android自定義一個(gè)view?ViewRootImpl繪制流程示例
這篇文章主要為大家介紹了Android自定義一個(gè)view?ViewRootImpl繪制流程示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-09-09

