跳转到内容

Button

Button 是 COUI 中的基础交互组件,用于触发操作或事件。提供了多种风格选择,包括主要按钮、次要按钮和文本按钮。

引入

kotlin
import io.github.suqi8.coui.kmp.basic.Button

基本用法

Button 组件可以用于触发操作或事件:

kotlin
Button(
    onClick = { /* 处理点击事件 */ }
) {
    Text("按钮")
}

按钮类型

COUI 提供了多种类型的按钮,适用于不同的场景和重要程度:

主要按钮(Primary Button)

kotlin
Button(
    onClick = { /* 处理点击事件 */ },
    colors = ButtonDefaults.buttonColorsPrimary()
) {
    Text("主要按钮")
}

次要按钮(Secondary Button)

kotlin
Button(
    onClick = { /* 处理点击事件 */ },
    colors = ButtonDefaults.buttonColors()
) {
    Text("次要按钮")
}

文本按钮(Text Button)

kotlin
TextButton(
    text = "文本按钮",
    onClick = { /* 处理点击事件 */ }
)

无边框文本按钮(Borderless Text Button)

对应 COUI 的 Widget.COUI.Button.Large.Borderless / Translate:无填充、主题色文字。

kotlin
TextButton(
    text = "无边框按钮",
    onClick = { /* 处理点击事件 */ },
    colors = ButtonDefaults.textButtonColorsBorderless()
)

小尺寸档(Small Size Tier)

ButtonDefaults 中的 Small 系列常量与 14sp 文字样式搭配使用,即可得到 COUI 小尺寸档(Widget.COUI.Button.Small):

kotlin
TextButton(
    text = "小按钮",
    onClick = { /* 处理点击事件 */ },
    cornerRadius = ButtonDefaults.CornerRadiusSmall,
    minWidth = ButtonDefaults.MinWidthSmall,
    minHeight = ButtonDefaults.MinHeightSmall,
    insideMargin = ButtonDefaults.InsideMarginSmall,
    textStyle = COUITheme.textStyles.button.copy(fontSize = 14.sp)
)

组件状态

禁用状态

kotlin
Button(
    onClick = { /* 处理点击事件 */ },
    enabled = false
) {
    Text("禁用按钮")
}

属性

Button 属性

属性名类型说明默认值是否必须
onClick() -> Unit点击按钮时触发的回调-
modifierModifier应用于按钮的修饰符Modifier
enabledBoolean按钮是否可点击true
pressScaleEnabledBoolean按压时按钮是否缩放(对应 COUIButton 的 scaleEnable)。填满容器单元格的按钮(如对话框按钮栏)应设为 false,此时按压反馈只有铺满整格的按压着色true
cornerRadiusDp按钮圆角半径ButtonDefaults.CornerRadius
minWidthDp按钮最小宽度ButtonDefaults.MinWidth
minHeightDp按钮最小高度ButtonDefaults.MinHeight
colorsButtonColors按钮颜色配置ButtonDefaults.buttonColors()
insideMarginPaddingValues按钮内部边距ButtonDefaults.InsideMargin
interactionSourceMutableInteractionSource?按钮的交互源null
indicationIndication?点击交互的反馈效果;默认为 null,因为 COUI 按压反馈(缩放 + 按压着色)已内置于按钮null
content@Composable RowScope.() -> Unit按钮内容区域的可组合函数-

TextButton 属性

属性名类型说明默认值是否必须
textString按钮显示的文本-
onClick() -> Unit点击按钮时触发的回调-
modifierModifier应用于按钮的修饰符Modifier
enabledBoolean按钮是否可点击true
pressScaleEnabledBoolean按压时按钮是否缩放(对应 COUIButton 的 scaleEnable)。填满容器单元格的按钮(如对话框按钮栏)应设为 falsetrue
colorsTextButtonColors文本按钮颜色配置ButtonDefaults.textButtonColors()
cornerRadiusDp按钮圆角半径ButtonDefaults.CornerRadius
minWidthDp按钮最小宽度ButtonDefaults.MinWidth
minHeightDp按钮最小高度ButtonDefaults.MinHeight
insideMarginPaddingValues按钮内部边距ButtonDefaults.InsideMargin
textStyleTextStyle标签文字样式(配合 Small 系列常量与 14sp 样式可得到 COUI 小尺寸档)COUITheme.textStyles.button
interactionSourceMutableInteractionSource?按钮的交互源null
indicationIndication?点击交互的反馈效果;默认为 null,因为 COUI 按压反馈(缩放 + 按压着色)已内置于按钮null

ButtonDefaults 对象

ButtonDefaults 对象提供了按钮组件的默认值和颜色配置。

常量

常量名类型说明默认值
PressedScaleFloat按下时按钮收缩到的最小比例(48 x 48dp 以内的表面)0.92f
PressedBrightnessFloat旧版 COUIButton 的 brightness 属性值;仅为源码兼容保留,已不再使用0.8f
MinWidthDp按钮的最小宽度58.dp
MinHeightDp按钮的最小高度44.dp
CornerRadiusDp按钮的圆角半径22.dp
InsideMarginPaddingValues按钮的内部边距PaddingValues(horizontal = 12.dp, vertical = 0.dp)
MinWidthSmallDp小尺寸档的最小宽度(COUI Widget.COUI.Button.Small)52.dp
MinHeightSmallDp小尺寸档的最小高度28.dp
CornerRadiusSmallDp小尺寸档的圆角半径(随高度的胶囊)14.dp
InsideMarginSmallPaddingValues小尺寸档的内部边距PaddingValues(horizontal = 12.dp, vertical = 4.dp)

方法

方法名类型说明
buttonColors()ButtonColors创建次要按钮的颜色配置
buttonColorsPrimary()ButtonColors创建主要按钮的颜色配置
textButtonColors()TextButtonColors创建次要文本按钮的颜色配置
textButtonColorsPrimary()TextButtonColors创建主要文本按钮的颜色配置
textButtonColorsBorderless()TextButtonColors创建无边框 / 文字按钮的颜色配置(透明填充、主题色文字)

进阶用法

带图标按钮

kotlin
Button(
    onClick = { /* 处理点击事件 */ }
) {
    Icon(
        imageVector = COUIIcons.Favorites,
        contentDescription = "Favorites"
    )
    Spacer(modifier = Modifier.width(8.dp))
    Text("带图标按钮")
}

自定义样式按钮

kotlin
Button(
    onClick = { /* 处理点击事件 */ },
    colors = ButtonDefaults.buttonColors(
        color = Color.Red.copy(alpha = 0.7f)
    ),
    cornerRadius = 8.dp
) {
    Text("自定义按钮")
}

加载状态按钮

kotlin
var isLoading by remember { mutableStateOf(false) }
val scope = rememberCoroutineScope()

Button(
    onClick = {
        isLoading = true
        // 模拟操作
        scope.launch {
            delay(2000)
            isLoading = false
        }
    },
    enabled = !isLoading
) {
     AnimatedVisibility(
        visible = isLoading
    ) {
        CircularProgressIndicator(
            modifier = Modifier.padding(end = 8.dp),
            size = 20.dp,
            strokeWidth = 4.dp
        )
    }
    Text("提交")
}

变更日志

基于 Apache-2.0 许可发布