鸿蒙ArkUI官方提供的toggle组件实现了开关的样式,但在使用过程中还是非常的不方便。
DIY可视化对鸿蒙ArkUI实现开关switch组件扩展后满足基本的switch需求,支持绑定值、设置标题文本、整个背景样式等。
/**
* 开关
*/
@Component
export default struct DiygwSwitch{
//绑定的值
@Link value:number;
//未选中图标
@State labelImg: Resource = $r('app.media.user');
//是否文本图片
@State isLabelImg: boolean = false;
@State labelImgWidth: number = 20;
@State labelImgHeight: number = 20;
//标题文本
@State label:string = '开关';
//水平状态时,文本占大小
@State labelWidth:number = 80;
//是否标题文本换行
@State isWrapLabel:boolean = false;
//是否标题文本
@State isLabel:boolean = true;
//标题颜色
@State labelColor:string = "#333333";
//自动标题长度
@State isLabelAuto:boolean = false;
//文本字体大小
@State textSize:number = 14;
//选中图版本大小
@State imgSize:number = 28;
//组件内边距
@State leftRightPadding:number = 16;
@State topBottomPadding:number = 6;
@State justifyContent:FlexAlign = FlexAlign.End
@State pointColor:string = "#fff";
@State selectedColor:string = "#07c160";
@State isShowValue:boolean = true;
@State isBorder:boolean = true;
build() {
Flex({
alignItems:this.isWrapLabel?ItemAlign.Start:ItemAlign.Center,
direction:this.isWrapLabel?FlexDirection.Column:FlexDirection.Row,
justifyContent:FlexAlign.Start
}){
if(this.isLabel){
Row(){
if(this.isLabelImg){
Image(this.labelImg)
.width(this.labelImgWidth)
.height(this.labelImgHeight)
.margin({ left:3 }).flexShrink(0)
}
if(this.isLabelAuto){
Text(this.label).flexShrink(0).fontColor(this.labelColor).fontSize(this.textSize).margin({
bottom:this.isWrapLabel?10:0,
right:10,
}).textAlign(TextAlign.Start);
}else{
Text(this.label).fontColor(this.labelColor).width(this.isWrapLabel?'100%':this.labelWidth).fontSize(this.textSize).margin({
bottom:this.isWrapLabel?10:0
}).textAlign(TextAlign.Start);
}
}.margin({
top:this.isWrapLabel?10:0
})
}
Flex({
alignItems:this.isWrapLabel?ItemAlign.Start:ItemAlign.Center,
justifyContent:this.justifyContent
}){
Toggle({ type: ToggleType.Switch, isOn: this.value==1 })
.selectedColor(this.selectedColor)
.switchPointColor(this.pointColor)
.height(40)
.onChange((isOn: boolean) => {
this.value = this.value==1?0:1
})
}
}.borderWidth({
bottom: this.isBorder?1:0
}).borderColor({
bottom: "#eee"
}).borderStyle(BorderStyle.Solid).borderStyle(BorderStyle.Solid).height(this.textSize+(this.isWrapLabel?20:0)+30+this.topBottomPadding*2).padding({left:this.leftRightPadding,right:this.leftRightPadding,top:this.topBottomPadding,bottom:this.topBottomPadding})
}
}
import {
navigateTo
} from '../common/Page'
import {
IDynamicObject
} from '../component/IType';
import DiygwSwitch from '../component/Switch'
@Entry
@Component
export struct User17069303301033d7f5a1283 {
@State switched: number = 1;
@State switch1: number = 1;
async onPageShow() {}
async aboutToAppear() {
await this.onPageShow()
}
build() {
Column() {
Navigation()
.width('100%')
.height('56vp')
.backgroundColor('#07c160')
.title(this.NavigationTitle())
.titleMode(NavigationTitleMode.Mini)
.align(Alignment.Center)
.hideBackButton(true)
Scroll() {
Flex({
direction: FlexDirection.Column
}) {
DiygwSwitch({
label: '开关',
value: $switched
})
.width('100%')
DiygwSwitch({
label: '开关',
value: $switch1
})
.width('97.33%')
.margin({
left: '5vp',
right: '5vp',
top: '5vp',
bottom: '5vp'
})
.borderRadius({
topLeft: '6vp',
topRight: '6vp',
bottomLeft: '6vp',
bottomRight: '6vp'
})
.backgroundColor("#d6d6d6")
}.height('100%')
}.height('100%').layoutWeight(1)
}.alignItems(HorizontalAlign.Start).height('100%')
}
@Builder
NavigationTitle() {
Column() {
Text('个人中心')
.width('100%')
.textAlign(TextAlign.Center)
.height('28vp')
.fontSize('20fp')
.fontWeight(500)
.fontColor('#fff')
}
}
}