鸿蒙Next选择按钮Toggle、Checkbox、Radio介绍
本文介绍一下常用的选择开关、单选、多选按钮使用。 效果演示:
####Toggle ToggleType提供勾选框样式(Checkbox)、状态按钮样式(Button)和开关样式(Switch) 仅当ToggleType设置为Button时,可包含子组件。 仅当ToggleType设置为Switch时,可设置Switch类型的圆形滑块颜色(switchPointColor)和设置Switch类型的样式(switchStyle)。 独立组件,相互不受影响,适合用于单独功能的开关控制或选择。 ####Checkbox Checkbox(options?: CheckboxOptions)提供了配置参数,可以配合CheckboxGroup实现分组,完成全选的功能。如果不使用分组,可以不配置。其中indicatorBuilder属性可以配置多选框的选中样式为自定义组件。 Checkbox相当于Toggle的勾选框样式(Checkbox)提供了更多的配置属性 可以设置非选中状态的边框颜色(unselectedColor) 设置多选框内部图标的样式(mark),默认选中对勾的,颜色、大小、粗细 设置CheckBox组件形状,包括圆形和圆角方形 ####CheckboxGroup 用于控制多选框全选或者不全选状态。 CheckboxGroup(options?: CheckboxGroupOptions)配置群组名称group,结合Checkbox设置的group,会将相同group的Checkbox分为一组,统一管理。 CheckboxGroup的onChange(callback: OnCheckboxGroupChangeCallback)会在CheckboxGroup的选中状态或群组内的Checkbox的选中状态发生变化时,触发回调。 返回当前群组选中状态:全选、全未选、部分选中,和选中的Checkbox的name ####Radio Radio和Checkbox配置类似,也可以配置群组, 但是他的群组内只能单选。 并且如果只使用一个Radio时,如果选中,是不支持自己取消选中的。 Radio为啥不能反选呢? 可以看一下Radio的源码:点击事件只能从未选中变为选中。
//gitee.com/openharmony/arkui_ace_engine/blob/master/frameworks/core
//render_radio.cpp
void RenderRadio::HandleClick()
{
if (!checked_) {
isClicked_ = true;
if (groupValueChangedListener_) {
LOGE("groupValueChangedListener_");
groupValueChangedListener_(radioValue_);
}
}
UpdateAnimation(true);
onController_->Play();
if (clickEvent_) {
clickEvent_();
}
if (onClick_) {
onClick_();
}
if (onChange_) {
onChange_(checked_);
}
}
当使用单选或者多选时,Radio和Checkbox的name属性是可以重复的,可以将name设置成属性的id,方便提交。 演示源码:
import { CircleShape } from '@kit.ArkUI'
@Extend(Text)
function textStyle(isOn: boolean) {
.fontColor(isOn ? Color.Red : Color.Black).fontSize(26)
}
@Extend(Radio)
function myRadioStyle() {
.checked(false)
.radioStyle({
checkedBackgroundColor: Color.Green, //开启状态底板颜色
uncheckedBorderColor:Color.Red, //关闭状态描边颜色
indicatorColor:Color.Yellow //开启状态内部圆饼颜色
})
.height(50)
.width(50)
}
@Entry
@ComponentV2
struct CheckButtonTest {
@Local checkBoxIsOn: boolean = false
@Local buttonIsOn: boolean = false
@Local switchIsOn: boolean = false
@Local checkSelectName: Array<string> =[]
@Local radioSelectName: string=''
//CheckBox 自定义多选框的选中样式
@Builder
indicatorBuilder(size:number) {
Image($r('app.media.reba')).clipShape(new CircleShape({ width: size, height: size }))
}
build() {
Column({space:10}) {
Text('Toggle单选组件').fontSize(30)
Row() {
Text('Checkbox单选框样式')
Toggle({ type: ToggleType.Checkbox, isOn: this.checkBoxIsOn })
.selectedColor('#007DFF') //打开状态下的背景颜色
.onChange((isOn: boolean) => {
this.checkBoxIsOn = isOn
})
Text(this.checkBoxIsOn ?'是' : '否').textStyle(this.checkBoxIsOn)
}.width('100%').justifyContent(FlexAlign.SpaceBetween)
Row() {
Text('Button状态按钮样式')
Toggle({ type: ToggleType.Button, isOn: this.buttonIsOn }){
Text('button').fontColor(this.buttonIsOn?Color.Black:Color.Gray).fontSize(12)
}
.selectedColor('#007DFF') //打开状态下的背景颜色
.onChange((isOn: boolean) => {
this.buttonIsOn = isOn
})
Text(this.buttonIsOn ? '是' : '否').textStyle(this.buttonIsOn)
}.width('100%').justifyContent(FlexAlign.SpaceBetween)
Row() {
Text('Switch状态按钮样式')
Toggle({ type: ToggleType.Switch, isOn: this.switchIsOn })
.selectedColor('#007DFF') //打开状态下的背景颜色
.switchPointColor('#FFFFFF') //圆形滑块颜色
.onChange((isOn: boolean) => {
this.switchIsOn = isOn
})
Text(this.switchIsOn ? '是' : '否').textStyle(this.switchIsOn)
}.width('100%').justifyContent(FlexAlign.SpaceBetween)
Row({space:30}){
Text('修改Switch样式')
Toggle({ type: ToggleType.Switch, isOn: false }).width(60).height(15)
.selectedColor(Color.Blue) //打开状态下的背景颜色
.switchPointColor(Color.Green) //圆形滑块颜色
.switchStyle({
pointRadius: 15, //圆形滑块半径
trackBorderRadius: 8, //滑轨的圆角
pointColor: Color.Yellow, //圆形滑块颜色 switchPointColor不生效
unselectedColor: Color.Gray //关闭状态的背景颜色
})
.onChange((isOn: boolean) => {
})
Toggle({ type: ToggleType.Switch, isOn: false }).width(71).height(30)
.selectedColor(Color.Blue) //打开状态下的背景颜色
.switchStyle({
pointRadius: -1, //圆形滑块半径 小于0时按照默认算法设置
trackBorderRadius: -1, //滑轨的圆角
pointColor: Color.Yellow, //圆形滑块颜色 switchPointColor不生效
unselectedColor: Color.Gray //关闭状态的背景颜色
})
.onChange((isOn: boolean) => {
})
}
Text('Checkbox多选组件').fontSize(30)
Row(){
Checkbox()
.select(false)
.selectedColor(Color.Blue) //多选框选中状态颜色
.unselectedColor(Color.Red)
.mark({ //多选框内部图标的样式
strokeColor:Color.Yellow, //内部图标颜色
size: 50, //内部图标大小
strokeWidth: 5 //内部图标粗细
})
.shape(CheckBoxShape.ROUNDED_SQUARE) //CheckBox组件形状
.onChange((value: boolean) => {
})
.width(50)
.height(50)
Checkbox()
.select(false)
.selectedColor(Color.Blue) //多选框选中状态颜色
.unselectedColor(Color.Gray)
.mark({ //多选框内部图标的样式
strokeColor:Color.Green, //内部图标颜色
size: 30, //内部图标大小
strokeWidth: 2 //内部图标粗细
})
.shape(CheckBoxShape.CIRCLE)
.width(50)
.height(50)
Checkbox({ name: '', group: '', //不使用CheckboxGroup 这两个参数可以不设置
indicatorBuilder:()=>{this.indicatorBuilder(50)}
})
.select(false)
.selectedColor(Color.Blue) //多选框选中状态颜色
.unselectedColor(Color.Gray)
.shape(CheckBoxShape.CIRCLE)
.width(50)
.height(50)
}
Text('CheckboxGroup多选群组').fontSize(30)
Text(this.checkSelectName.length>0?'选中'+this.checkSelectName.toString():'未选中')
Row(){
CheckboxGroup({ group: 'g1' })
.checkboxShape(CheckBoxShape.ROUNDED_SQUARE)
.selectedColor(Color.Green)
.unselectedColor(Color.Gray)
.onChange((itemName: CheckboxGroupResult) => {
this.checkSelectName=[]
this.checkSelectName=itemName.name
//itemName.statust 选中状态
//All 群组多选择框全部选择。
//Part 群组多选择框部分选择。
//None 群组多选择框全部没有选择。
})
.mark({
strokeColor:Color.Black,
size: 40,
strokeWidth: 5
})
.width(50)
.height(50)
Checkbox({ name: 'cb1', group: 'g1',
indicatorBuilder:()=>{this.indicatorBuilder(50)}
})
.select(false)
.selectedColor(Color.Blue)
.unselectedColor(Color.Gray)
.shape(CheckBoxShape.CIRCLE)
.width(50)
.height(50)
Checkbox({ name: 'cb2', group: 'g1',
indicatorBuilder:()=>{this.indicatorBuilder(50)}
})
.select(false)
.selectedColor(Color.Blue)
.unselectedColor(Color.Gray)
.shape(CheckBoxShape.CIRCLE)
.width(50)
.height(50)
Checkbox({ name: 'cb3', group: 'g1',
indicatorBuilder:()=>{this.indicatorBuilder(50)}
})
.select(false)
.selectedColor(Color.Blue)
.unselectedColor(Color.Gray)
.shape(CheckBoxShape.CIRCLE)
.width(50)
.height(50)
Checkbox({ name: 'cb3', group: 'g1',
})
.select(true)
.selectedColor(Color.Blue) //多选框选中状态颜色
.unselectedColor(Color.Gray)
.mark({ //多选框内部图标的样式
strokeColor:Color.Green, //内部图标颜色
size: 30, //内部图标大小
strokeWidth: 2 //内部图标粗细
})
.shape(CheckBoxShape.CIRCLE)
.width(50)
.height(50)
}
Text('Radio单选框').fontSize(30)
Text('Radio选中:'+this.radioSelectName)
Row({space:10}){
Radio({ value: 'Radio1', group: 'radioGroup' })
.myRadioStyle()
.onChange((isChecked: boolean) => {
if(isChecked)this.radioSelectName='Radio1'
})
Radio({ value: 'Radio2', group: 'radioGroup' })
.myRadioStyle()
.onChange((isChecked: boolean) => {
if(isChecked)this.radioSelectName='Radio2'
})
Radio({ value: 'Radio3', group: 'radioGroup' })
.myRadioStyle()
.onChange((isChecked: boolean) => {
if(isChecked)this.radioSelectName='Radio3'
})
Radio({ value: 'Radio3', group: 'radioGroup' })
.myRadioStyle()
.onChange((isChecked: boolean) => {
if(isChecked)this.radioSelectName='Radio4'
})
}
}
.width('100%')
.height('100%')
}
}
- 0回答
- 0粉丝
- 0关注
- 「Mac畅玩鸿蒙与硬件14」鸿蒙UI组件篇4 - Toggle和Checkbox组件
- 鸿蒙Next显示动画animateTo介绍
- 鸿蒙Next数据面板组件DataPanel介绍
- 【HarmonyOS Next】图片选择方案
- 鸿蒙Next软键盘弹出避让机制介绍
- 鸿蒙Next数据量环形图标Gauge介绍
- 鸿蒙Next应用桌面快捷操作shortcuts和Form卡片介绍
- 200.HarmonyOS NEXT系列教程之图案锁按钮交互详解
- 鸿蒙无权限实现图片选择拍照和录视频
- 「Mac畅玩鸿蒙与硬件43」UI互动应用篇20 - 闪烁按钮效果
- harmony OS NEXT-应用状态-AppStorage详细介绍
- HarmonyOS NEXT 头像制作项目系列教程之 --- 头像选择功能实现
- harmony OS NEXT-基本介绍及DevcoStudiop基本使用
- harmony OS NEXT-UIAbility内状态-LocalStorage详细介绍
- 【HarmonyOS NEXT】 ArkUI常用布局及组件库介绍