美文网首页1024
38、鸿蒙/组件/自定义弹窗 (CustomDialog)

38、鸿蒙/组件/自定义弹窗 (CustomDialog)

作者: 圆梦人生 | 来源:发表于2024-07-29 09:20 被阅读0次

    CustomDialog是自定义弹窗,可用于广告、中奖、警告、软件更新等与用户交互响应操作。开发者可以通过CustomDialogController类显示自定义弹窗。具体用法请参考自定义弹窗

    创建自定义弹窗

    • 使用@CustomDialog装饰器装饰自定义弹窗。
    • @CustomDialog装饰器用于装饰自定义弹框,此装饰器内进行自定义内容(也就是弹框内容)。
    • 新建组件文件CustomDialogCmp.ets
    // 定义自定义弹框
    @CustomDialog
    export struct CustomDialogCmp {
      controll: CustomDialogController = new CustomDialogController({
        builder: CustomDialogCmp({})
      })
      //
      build() {
        Column(){
          Text('弹框内容区域').fontSize(20).padding(20)
        }
      }
    }
    
    • 引入组件文件并绑定onClick事件绑定的组件使弹窗弹出;CustomDialog.ets
    //
    import { CustomDialogCmp } from './cmp/CustomDialogCmp'
    //
    // @Entry
    @Component
    export struct CustomDialog {
      //
      dialog: CustomDialogController = new CustomDialogController({
        builder: CustomDialogCmp()
      })
      //
      build() {
        Column(){
          Button('点击显示弹框').onClick(e=>{
            this.dialog.open();
          })
        }
      }
    }
    
    
    CustomDialog.png

    弹窗的交互

    弹窗可用于数据交互,完成用户一系列响应操作。

    • 在CustomDialogCmp.ets改造下。
    // 定义自定义弹框
    @CustomDialog
    export struct CustomDialogCmp {
      cancel?: () => void
      confirm?: () => void
      //
      controll: CustomDialogController = new CustomDialogController({
        builder: CustomDialogCmp({})
      })
      //
      build() {
        Column(){
          Text('弹框内容区域').fontSize(20).padding(20)
          Flex({ justifyContent: FlexAlign.SpaceAround }){
            Button('取消').onClick(() => {
                this.controll.close()
                if (this.cancel) {
                  this.cancel()
                }
              }).backgroundColor(0xffffff).fontColor(Color.Black);
            Button('确定')
              .onClick(() => {
                this.controll.close()
                if (this.confirm) {
                  this.confirm()
                }
              }).backgroundColor(0xffffff).fontColor(Color.Red)
          }.padding(20)
        }
      }
    }
    
    • 页面内需要在构造器内进行接收,同时创建相应的函数操作。
    //
    import { CustomDialogCmp } from './cmp/CustomDialogCmp'
    //
    // @Entry
    @Component
    export struct CustomDialog {
      //
      dialog: CustomDialogController = new CustomDialogController({
        builder: CustomDialogCmp({
          cancel: ()=>{ this.onCancel() },
          confirm: ()=>{ this.onAccept() }
        })
      });
      // 点击了取消
      onCancel(){
        console.log('点击了取消按钮');
      }
      // 点击了确定
      onAccept(){
        console.log('点击了确定按钮');
      }
      //
      build() {
        Column(){
          Button('点击显示弹框').onClick(e=>{
            this.dialog.open();
          })
        }
      }
    }
    
    CustomDialog.png

    弹窗的动画

    弹窗通过定义openAnimation控制弹窗出现动画的持续时间,速度等参数。

    //
    import { CustomDialogCmp } from './cmp/CustomDialogCmp'
    @Component
    export struct CustomDialog {
      //
      dialog: CustomDialogController = new CustomDialogController({
        builder: CustomDialogCmp({
          cancel: ()=>{ this.onCancel() },
          confirm: ()=>{ this.onAccept() }
        }),
        // 添加动画
        openAnimation: {
          duration: 1000,
          curve: Curve.Friction,
          delay: 500,
          playMode: PlayMode.Alternate,
          onFinish: () => {
            console.info('play end')
          }
        },
      });
      // 点击了取消
      onCancel(){
        console.log('点击了取消按钮');
      }
      // 点击了确定
      onAccept(){
        console.log('点击了确定按钮');
      }
      //
      build() {
        Column(){
          Button('点击显示弹框').onClick(e=>{
            this.dialog.open();
          })
        }
      }
    }
    

    弹窗的样式

    弹窗通过定义宽度、高度、背景色、阴影等参数来控制样式。

    //
    import { CustomDialogCmp } from './cmp/CustomDialogCmp'
    //
    // @Entry
    @Component
    export struct CustomDialog {
      //
      dialog: CustomDialogController = new CustomDialogController({
        builder: CustomDialogCmp({
          cancel: ()=>{ this.onCancel() },
          confirm: ()=>{ this.onAccept() }
        }),
        // 添加动画
        openAnimation: {
          duration: 1000,
          curve: Curve.Friction,
          delay: 500,
          playMode: PlayMode.Alternate,
          onFinish: () => {
            console.info('play end')
          }
        },
        // 边框和阴影
        borderStyle: BorderStyle.Dashed,//使用borderStyle属性,需要和borderWidth属性一起使用
        borderColor: Color.Blue,//使用borderColor属性,需要和borderWidth属性一起使用
        shadow: ({ radius: 20, color: Color.Grey, offsetX: 50, offsetY: 0}),
      });
      // 点击了取消
      onCancel(){
        console.log('点击了取消按钮');
      }
      // 点击了确定
      onAccept(){
        console.log('点击了确定按钮');
      }
      //
      build() {
        Column(){
          Button('点击显示弹框').onClick(e=>{
            this.dialog.open();
          })
        }
      }
    }
    
    弹框边框.png
    • 点击按钮使用Alert
    Button('点击').onClick(()=>{
      AlertDialog.show({
        title: '温馨提示',
        message: '点击了确认',
        confirm: {
          value: '确定',
          action: ()=>{
            console.log('点击了确认');
          }
         },
        cancel: ()=>{
           console.log('取消');
         }
      })
    })
    

    相关文章

      网友评论

        本文标题:38、鸿蒙/组件/自定义弹窗 (CustomDialog)

        本文链接:https://www.haomeiwen.com/subject/qporhjtx.html