关于鸿蒙的知识点——模态转场

292 阅读1分钟

1. 模态转场

以下是模态转场的基本使用场景

bindsheet的动画.gif 全模态 bindsheet的动画1.gif 半模态

2. 模态转场的基本属性

bindSheetisShow: boolean,builder: CustomBuilder,options?: SheetOptions给组件绑定半模态页面,点击后显示模态页面。isShow: 是否显示半模态页面。从API version 10开始,该参数支持$$双向绑定变量builder: 配置半模态页面内容。options: 配置半模态页面的可选属性。

3. 模态转场的两个分类

3.1. 半模态转场

半模态顾名思义,就是半屏的模态效果(图 2)

@Entry
  @Component
  struct SheetTransitionExample1 {
    // 1. 定义控制变量
    @State isShow: boolean = false

    // 2.自定义内容
    @Builder
    myBuilder() {
       // 结构略
    }

    build() {
      Column() {
        Button(`显示半模态`)
          //  3.绑定半模态框
          .bindSheet(this.isShow, this.myBuilder())
          .onClick(() => {
            // 4.控制显示
            this.isShow = true
          })
      }
    }
  }
名称参数参数描述
bindSheetisShow: boolean,builder: CustomBuilder,options?: SheetOptions给组件绑定半模态页面,点击后显示模态页面。isShow: 是否显示半模态页面。从API version 10开始,该参数支持$$双向绑定变量builder: 配置半模态页面内容。options: 配置半模态页面的可选属性。

3.2 显示状态双向绑定

上一节的代码有个小问题,如果通过那个关闭按钮来关闭模态会出现无法开启的情况

image.png

官方给出了解决方案:

说明

在非双向绑定情况下,以拖拽方式关闭半模态页面不会改变isShow参数的值。

为了使isShow参数值与半模态界面的状态同步,建议使用$$双向绑定isShow参数。

3.3 全屏模态

刚刚是半模态,接下来咱们来看看全屏模态

bindsheet的动画.gif

名称参数参数描述
bindContentCoverisShow: boolean,builder: CustomBuilder,options?: ContentCoverOptions给组件绑定全屏模态页面,点击后显示模态页面。模态页面内容自定义,显示方式可设置无动画过渡,上下切换过渡以及透明渐变过渡方式。isShow: 是否显示全屏模态页面。从API version 10开始,该参数支持$$双向绑定变量builder: 配置全屏模态页面内容。options: 配置全屏模态页面的可选属性(详细可以参考文档,用的不多)
// xxx.ets
@Entry
@Component
struct ModalTransitionExample {
  // 定义控制显示的变量
  @State isShow: boolean = false

  // 全屏模态的 Builder
  @Builder
  myBuilder() {
    Column() {
    }
    .width('100%')
    .height('100%')
    .backgroundColor('#0094ff')
    .justifyContent(FlexAlign.Center)
  }

  build() {
    Column() {
      Button(`显示全屏模态${this.isShow}`)
        .fontSize(20)
        .margin(10)
        // 绑定并控制显示
        .bindContentCover(this.isShow, this.myBuilder())
        .onClick(() => {
          this.isShow = true
        })
    }
    .justifyContent(FlexAlign.Center)
    .width('100%')
    .height('100%')
  }
}

4. 实现模态转场的完整代码和效果图

@Entry
@Component
struct AnLi {
  @State isShow :boolean = true
  @Builder
  fn(){
    Column({space:15 }){
      Row(){
        Text('分享给好友')
          .fontSize(20)
          .fontWeight(500)
          .layoutWeight(1)
          .textAlign(TextAlign.Center)

        Image($r('app.media.ic_public_cancel'))
          .width(20)
          .height(20)
          .onClick(()=>{
            this.isShow = false

          })
      }
      .padding(20)
      .width('100%')
      .justifyContent(FlexAlign.SpaceBetween)

      Row(){
        Column({space:10}){

          Image($r('app.media.ic_share_wechat'))
            .width(40)

          Text('微信')
            .fontSize(10)

        }
        Column({space:10}){

          Image($r('app.media.ic_share_wechat'))
            .width(40)

          Text('微信')
            .fontSize(10)

        }
        Column({space:10}){

          Image($r('app.media.ic_share_wechat'))
            .width(40)

          Text('微信')
            .fontSize(10)

        }
        Column({space:10}){

          Image($r('app.media.ic_share_wechat'))
            .width(40)

          Text('微信')
            .fontSize(10)

        }
      }
      .width('100%')
      .justifyContent(FlexAlign.SpaceAround)

    }
    .margin({bottom:50})
    .width('100%')

  }

  build() {
    Column(){
      Button('点击')

        .onClick(()=>{

          this.isShow = true
        })

    }
    .bindSheet($$this.isShow,this.fn(),{
      showClose:false,
      height:SheetSize.FIT_CONTENT,
      dragBar:true,
      detents:[SheetSize.FIT_CONTENT,SheetSize.MEDIUM]

    })
    .width('100%')
    .height('100%')
    .backgroundColor(Color.Pink)
  }
}

动画演示

bindsheet_微信分享.gif