鸿蒙ArkUI实现开关switch组件

简介: 鸿蒙ArkUI实现开关switch组件

鸿蒙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')
        }
    }
 
 
}
目录
相关文章
|
2天前
|
JSON API 数据格式
低代码实现鸿蒙API返回JSON转TS及快速生成ArkUI代码
低代码实现鸿蒙API返回JSON转TS及快速生成ArkUI代码
7 0
低代码实现鸿蒙API返回JSON转TS及快速生成ArkUI代码
|
5天前
扩展鸿蒙ArkUI日期组件
扩展鸿蒙ArkUI日期组件
18 1
|
5天前
|
数据可视化 JavaScript API
鸿蒙低代码可视化ArkUI代码生成器
鸿蒙低代码可视化ArkUI代码生成器
21 0
|
5天前
扩展鸿蒙textinput组件
扩展鸿蒙textinput组件
15 0
|
5天前
鸿蒙ArkUI实现的Slider组件
鸿蒙ArkUI实现的Slider组件
19 0
|
5天前
鸿蒙ArkUI日期选择组件
鸿蒙ArkUI日期选择组件
22 0
HarmonyOS实战—组件的外边距和内边距
HarmonyOS实战—组件的外边距和内边距
262 0
HarmonyOS实战—组件的外边距和内边距
|
IDE JavaScript API
HarmonyOS开发第一步,熟知开发工具DevEco Studio
本文主要以常见的功能点作为概述希望可以帮助到学习HarmonyOS的开发者。
475 0
|
7天前
|
Android开发 iOS开发 容器
鸿蒙harmonyos next flutter混合开发之开发FFI plugin
鸿蒙harmonyos next flutter混合开发之开发FFI plugin
|
2天前
|
开发框架 JavaScript 前端开发
鸿蒙NEXT开发声明式UI是咋回事?
【10月更文挑战第15天】鸿蒙NEXT的声明式UI基于ArkTS,提供高效简洁的开发体验。ArkTS扩展了TypeScript,支持声明式UI描述、自定义组件及状态管理。ArkUI框架则提供了丰富的组件、布局计算和动画能力。开发者仅需关注数据变化,UI将自动更新,简化了开发流程。此外,其前后端分层设计与编译时优化确保了高性能运行,利于生态发展。通过组件创建、状态管理和渲染控制等方式,开发者能快速构建高质量的鸿蒙应用。