Skip to content

Switch 开关 ​

胶囊轨道 + 圆形滑块的两态切换控件,支持加载态占位。

契约源:lh-ui-core/specs/switch.json · 黄金用例:cases/switch.json(6 条,已翻译为 JVM 单测 + Compose UI Test)

状态 ​

开启取主色轨道,关闭取描边色轨道;滑块直径 = 高度 - 2 × switch.gap,位移动画取 motion.duration.base。

9:41Switch
关闭
开启
禁用(关)
禁用(开)
加载中(滑块位置显示加载环,不响应点击)

HTML 模拟预览(Android / Compose 外观),非真机渲染

kotlin
var on by remember { mutableStateOf(false) }
LhSwitch(checked = on, onChange = { on = it })

尺寸 ​

三档尺寸映射到 switch.width / switch.height 令牌。

9:41Switch 尺寸

HTML 模拟预览(Android / Compose 外观),非真机渲染

API ​

Props ​

属性说明类型默认值
checked是否开启(必填)Boolean—
onChange开关态变更回调,携带新开关态(Boolean) -> Unit—
disabled是否禁用Booleanfalse
loading是否加载中(滑块位置显示加载环,不响应点击)Booleanfalse
size尺寸LhSwitchSizeMedium
modifier修饰符ModifierModifier

LhSwitchSize ​

值widthheight
Smallswitch.width.small(36dp)switch.height.small(20dp)
Mediumswitch.width.medium(44dp)switch.height.medium(24dp)
Largeswitch.width.large(52dp)switch.height.large(28dp)

轨道为胶囊(圆角取高度一半);点击命中轨道区域,翻转开关态并触发 onChange。

令牌对照 ​

令牌用途
switch.width.{small,medium,large}三档轨道宽度
switch.height.{small,medium,large}三档轨道高度
switch.gap滑块与轨道之间的留白(滑块直径 = 高度 - 2 × gap)
color.primary.default开启轨道色
color.border.base关闭轨道色
color.onPrimary滑块色
color.disabled.{bg,text}禁用轨道 / 滑块色
motion.duration.base / motion.easing.easeInOut滑块位移动画
loading.strokeWidth加载环描边宽(复用)

黄金用例对照 ​

case id断言本地测试
tap-toggles-and-emits-onchange点击翻转并发射 onChangeLhSwitchTest.tap_unchecked_emits_true(Compose UI Test)
tap-checked-turns-off开启态点击关闭LhSwitchTest.tap_checked_emits_false
disabled-blocks-change禁用态不触发LhSwitchTest.disabled_blocks_change
loading-blocks-change加载态不触发LhSwitchTest.loading_blocks_change
checked-uses-primary-token开启消费主色令牌LhSwitchDefaultsTest.checked_uses_primary_token
unchecked-uses-border-token关闭消费描边令牌LhSwitchDefaultsTest.unchecked_uses_border_token
bash
./gradlew :components:switch:test                             # JVM 部分
./gradlew :components:switch:connectedAndroidTest            # 交互部分(需设备)