积分104 / 贡献0

提问1答案被采纳1文章7

作者动态

[经验分享] OpenHarmony应用如何使用bindSheet属性为组件绑定半模态页面

深开鸿_苟晶晶 显示全部楼层 发表于 2024-1-19 16:19:09

OpenHarmony应用如何使用bindSheet属性为组件绑定半模态页面

简介:

为组件绑定半模态页面可以使用.bindSheet属性。

文档环境:

  • 开发环境:Windows 11家庭版
  • DevEco Studio版本:DevEco Studio 3.1.1 Release (3.1.0.501)
  • SDK版本:4.1.6.1 Beta1(full sdk)
  • 开发板型号:DAYU200(RK3568)
  • 系统版本:OpenHarmony 4.1.6.1

演示demo:

  • 新建一个 Stage 框架的 demo 工程,在page/Index.ets中新增组件控制半模态页面的各种属性:允许开发者配置所在页面是否允许交互、设置弹出的半模态页面的切换高度档位、设置弹出的半模态弹出样式、设置弹出的半模态所在页面是否显示关闭图标、设置弹出的半模态页面是否使用模糊背景。

  • 新增Button按钮,使用.bindSheet绑定上述半模态页面。 核心代码如下:

    import { TitleBar } from '../../../../common/TitleBar'
    import { IntroductionTitle } from '../../../../common/IntroductionTitle'
    import promptAction from '@ohos.promptAction';
    import { BusinessError } from '@ohos.base';
    import Logger from '../../../../util/Logger';
    
    // 自定义半模态页面高度
    const SIZE: number = 200;
    
    @Extend(Text) function textStyle() {
      .fontFamily('HarmonyHeiTi-Medium')
      .fontSize(16)
      .fontColor('#182431')
      .textAlign(TextAlign.Start)
      .lineHeight(22)
      .fontWeight(500)
    }
    
    interface SheetSizes {
      medium: boolean;
      large: boolean;
      size200: boolean;
    }
    
    @Entry
    @Component
    struct BindSheetSample {
      @State isShow: boolean = false
      @State showDragBar: boolean = true;
      @State enableOutsideInteractive: boolean = true;
      @State popStyle: number = SheetType.BOTTOM;
      @State showClose: boolean = true;
      @State blurStyle: BlurStyle = BlurStyle.NONE;
      @State detentsArray: number[] = [];
      @State detents: [(SheetSize | Length), (SheetSize | Length)?, (SheetSize | Length)?] = [SheetSize.MEDIUM, SIZE];
      @State mediumSelected: boolean = true;
      @State largeSelected: boolean = false;
      @State size200Selected: boolean = true;
      @State mediumText: string = 'Medium';
      @State largeText: string = 'Large';
      @State size200Text: string = '200';
      private sheetSizes: SheetSizes = { medium: true, large: false, size200: true };
    
      @Builder myBuilder() {
        Column() {
        }
        .width('100%')
      }
    
      build() {
        Column() {
          TitleBar({ title: $r('app.string.global_bindSheet_menu') })
            .backgroundColor('#F1F3F5')
          Scroll() {
            Column() {
              Row() {
                Column() {
                  Text($r('app.string.global_bindSheet_text_allow_interaction'))
                    .fontSize(16)
                    .fontColor('#000000')
                    .fontWeight(500)
                    .fontFamily('HarmonyHeiTi-Medium')
                    .textAlign(TextAlign.Start)
                    .width('70%')
                  Text($r('app.string.global_bindSheet_text_desc'))
                    .fontSize(14)
                    .fontColor('#000000')
                    .fontWeight(400)
                    .fontFamily('HarmonyHeiTi')
                    .textAlign(TextAlign.Start)
                    .width('70%')
                }
                .margin({ left: 12, top: 6, bottom: 6 })
                .align(Alignment.Start)
    
                Blank()
    
                Toggle({ type: ToggleType.Switch, isOn: this.enableOutsideInteractive })
                  .id('enable_interactive')
                  .margin({ right: 12, top: 8, bottom: 8 })
                  .onChange((isOn: boolean) => {
                    if (isOn) {
                      this.enableOutsideInteractive = true;
                    } else {
                      this.enableOutsideInteractive = false;
                    }
                  })
              }
              .backgroundColor('#ffffff')
              .borderRadius(24)
              .width('100%')
    
              Text($r('app.string.pop_height'))
                .lineHeight(19)
                .fontWeight(500)
                .fontFamily('HarmonyHeiTi-Medium')
                .fontSize(14)
                .width('100%')
                .direction(Direction.Ltr)
                .margin({ left: 26, top: 19.5, bottom: 9.5 })
                .fontColor($r('app.color.font_color_shallow'))
    
              Column() {
                Row() {
                  Text(this.mediumText)
                    .textStyle()
                    .margin({ left: 12, top: 8, bottom: 8 })
                  Blank()
                  Checkbox()
                    .select(this.mediumSelected)
                    .borderRadius(4)
                    .margin({ right: 12, top: 8, bottom: 8 })
                    .onChange((value: boolean) => {
                      if (value) {
                        this.sheetSizes.medium = true;
                      } else {
                        this.sheetSizes.medium = false;
                      }
                    })
                }
                .width('100%')
                .margin({ top: 4 })
    
                Divider()
                  .strokeWidth(1)
                  .margin(8)
                  .color('#182431')
                  .opacity(0.05)
    
                Row() {
                  Text(this.largeText)
                    .textStyle()
                    .margin({ left: 12, top: 8, bottom: 8 })
                  Blank()
                  Checkbox()
                    .select(this.largeSelected)
                    .borderRadius(4)
                    .margin({ right: 12, top: 8, bottom: 8 })
                    .onChange((value: boolean) => {
                      if (value) {
                        this.sheetSizes.large = true;
                      } else {
                        this.sheetSizes.large = false;
                      }
                    })
                }
                .width('100%')
                .margin({ top: 4 })
    
                Divider()
                  .strokeWidth(1)
                  .margin(8)
                  .color('#182431')
                  .opacity(0.05)
    
                Row() {
                  Text(this.size200Text)
                    .textStyle()
                    .margin({ left: 12, top: 8, bottom: 8 })
                  Blank()
                  Checkbox()
                    .select(this.size200Selected)
                    .borderRadius(4)
                    .margin({ right: 12, top: 8, bottom: 8 })
                    .onChange((value: boolean) => {
                      if (value) {
                        this.sheetSizes.size200 = true;
                      } else {
                        this.sheetSizes.size200 = false;
                      }
                    })
                }
                .width('100%')
                .margin({ top: 4, bottom: 4 })
              }
              .backgroundColor('#ffffff')
              .borderRadius(24)
              .margin({ top: 12 })
              .width('100%')
    
              Row() {
                Text($r('app.string.bindSheet_popup_style'))
                  .textStyle()
                  .margin({ left: 12, top: 8, bottom: 8 })
                Blank()
                Select([{ value: $r('app.string.bindSheet_default_popup') },
                  { value: $r('app.string.bindSheet_centered_popup') },
                  { value: $r('app.string.bindSheet_popup_appears') }])
                  .id('popup_style')
                  .selected(0)
                  .value($r('app.string.bindSheet_default_popup'))
                  .margin({ right: 12, top: 8, bottom: 8 })
                  .fontColor('#182431')
                  .onSelect((index: number) => {
                    if (index === 0) {
                      this.popStyle = SheetType.BOTTOM;
                    } else if (index === 1) {
                      this.popStyle = SheetType.CENTER;
                    } else {
                      this.popStyle = SheetType.POPUP;
                    }
                  })
              }
              .backgroundColor('#ffffff')
              .borderRadius(24)
              .margin({ top: 20 })
              .width('100%')
    
              Row() {
                Text($r('app.string.bindSheet_icon'))
                  .textStyle()
                  .margin({ left: 12, top: 17, bottom: 17 })
                Blank()
                Toggle({ type: ToggleType.Switch, isOn: this.showClose })
                  .margin({ right: 12, top: 17, bottom: 17 })
                  .onChange((isOn: boolean) => {
                    if (isOn) {
                      this.showClose = true;
                    } else {
                      this.showClose = false;
                    }
                  })
              }
              .backgroundColor('#ffffff')
              .borderRadius(24)
              .margin({ top: 20 })
              .width('100%')
    
              Row() {
                Text($r('app.string.bindSheet_blurred_background_texture'))
                  .textStyle()
                  .margin({ left: 12, top: 17, bottom: 17 })
                Blank()
                Toggle({ type: ToggleType.Switch, isOn: false })
                  .id('bindSheet_blur')
                  .margin({ right: 12, top: 17, bottom: 17 })
                  .onChange((isOn: boolean) => {
                    if (isOn) {
                      this.blurStyle = BlurStyle.Thick;
                    } else {
                      this.blurStyle = BlurStyle.NONE;
                    }
                  })
              }
              .backgroundColor('#ffffff')
              .borderRadius(24)
              .margin({ top: 20 })
              .width('100%')
    
              Blank()
              Button($r('app.string.bindSheet_popup_modal_interface'),
                { type: ButtonType.Normal, stateEffect: true })
                .id('bindSheet_button')
                .borderRadius(24)
                .width('86.7%')
                .height('5.1%')
                .margin({ left: 24, right: 24, bottom: 72 })
                .bindSheet($$this.isShow, this.myBuilder(),
                  {
                    enableOutsideInteractive: this.enableOutsideInteractive,
                    dragBar: this.showDragBar,
                    backgroundColor: '#FFFFFF',
                    detents: this.detents,
                    blurStyle: this.blurStyle,
                    showClose: this.showClose,
                    title: { title: "Title" },
                    preferType: this.popStyle,
                    shouldDismiss: ((sheetDismiss: SheetDismiss) => {
                      // 弹出弹窗
                      try {
                        promptAction.showDialog({
                          message: $r('app.string.bindSheet_close_modal'),
                          buttons: [
                            {
                              text: $r('app.string.bindSheet_close_cancel'),
                              color: '#0A59F7'
                            },
                            {
                              text: $r('app.string.bindSheet_close_confirm'),
                              color: '#0A59F7'
                            }
                          ]
                        }, (err, data) => {
                          if (err) {
                            Logger.error('showDialog err: ' + err);
                            return;
                          }
                          if (data.index === 1) {
                            this.detentsArray.length = 0;
                            this.detents = [SheetSize.MEDIUM, SIZE];
                            sheetDismiss.dismiss();
                          }
                        });
                      } catch (error) {
                        let message = (error as BusinessError).message;
                        let code = (error as BusinessError).code;
                        Logger.error('showDialog args error code is' + code, 'message is' + message);
                      };
                    })
                  })
                .onClick(() => {
                  this.isShow = true
                  if (this.sheetSizes.medium) {
                    this.detentsArray.push(SheetSize.MEDIUM);
                  }
                  if (this.sheetSizes.large) {
                    this.detentsArray.push(SheetSize.LARGE);
                  }
                  if (this.sheetSizes.size200) {
                    this.detentsArray.push(SIZE);
                  }
                  for (let i = 0; i < this.detentsArray.length; i++) {
                    this.detents[i] = this.detentsArray[i];
                  }
                })
            }
            .backgroundColor('#f1f3f5')
            .constraintSize({ minHeight: '100%' }) // Let the minHeight of the component cover screen at least
            .height('100%')
          }
          .backgroundColor('#f1f3f5')
          .height('100%')
          .padding({ left: 12, right: 12, bottom: 12, top: 12 })
        }
      }
    }

©著作权归作者所有,转载或内容合作请联系作者

您尚未登录,无法参与评论,登录后可以:
参与开源共建问题交流
认同或收藏高质量问答
获取积分成为开源共建先驱

Copyright   ©2023  OpenHarmony开发者论坛  京ICP备2020036654号-3 |技术支持 Discuz!

返回顶部