鸿蒙开发:弹出库更新至1.2.2版本,新增模态页面弹出

前言

最近一段时间,自己把更多的精力放在了内部测试插件的开发,以至于,自己维护的很多库,大家在Github中Issues提的问题,迟迟没有第一时间进行解决,不是不解决,而是实在腾不出时间,还好,内部测试插件已经完成开发,所维护的库,接下来也会提了日程进行一一解决。

今天把弹窗库(dialog)进行了更新,由1.2.1版本更新至了1.2.2版本,此版本最大的改动有两个,一个是新增了模态页面弹出,第二个是,优化了使用底部弹出动画组件的数据更新。

所谓的模态页面,其实就是一种大面板大视图交互式的弹窗,和其他弹窗组件一样,通常用于在保持当前的上下文环境时,临时展示用户需关注的信息或待处理的操作,基础库中使用了openBindSheet的形式进行实现,主要目的是可以实现在任意位置,任意地方进行弹出,不受其它条件的约束。

弹出库其它功能的使用方式,之前有过介绍,在中心仓库中也有着很详细的介绍,这里就不过多介绍了,只把更新的部分做下概述,dialog弹出中心仓库地址:

ohpm.openharmony.cn/#/cn/detail...

模态页面弹出效果

模态页面功能实现

模态页面,所有的UI都有业务端自定义,所以在使用之前,请绘制好自己的模态页面UI。

1、普通模态页面

声明一个Builder用于展示模态页面UI。

TypeScript 复制代码
@Builder
  function sheetView() {
    Column() {
      Text("我是一个普通的模态页面")
        .width("100%")
        .height(100)
        .textAlign(TextAlign.Center)
    }
  }

在需要调用的地方使用,可以是任意的位置,默认弹出是全屏高度。

TypeScript 复制代码
showDialogSheet({ layout: wrapBuilder(sheetView) })

2、半模态高度(屏幕一半)

主要是通过height属性来设置模态页面的弹出高度,sheetView视图是自己定义的全局Builder。

TypeScript 复制代码
showDialogSheet({
  layout: wrapBuilder(sheetView),
  options: {
    height: SheetSize.MEDIUM
  }
})

3、半模态高度(屏幕高度)

可以不设置,不设置也是默认的屏幕高度。

TypeScript 复制代码
showDialogSheet({
  layout: wrapBuilder(sheetView),
  options: {
    height: SheetSize.LARGE
  }
})

4、半模态高度(自适应内容高度)

内容有多高,模态页面就会展示多高。

TypeScript 复制代码
showDialogSheet({
  layout: wrapBuilder(sheetView),
  options: {
    height: SheetSize.FIT_CONTENT
  }
})

5、半模态高度(自定义高度)

也可以自由控制高度。

TypeScript 复制代码
showDialogSheet({
  layout: wrapBuilder(sheetView),
  options: {
    height: 300
  }
})

6、隐藏关闭按钮

默认情况下,右上角会带关闭按钮,可以通过showClose设置为false来隐藏。

TypeScript 复制代码
showDialogSheet({
  layout: wrapBuilder(sheetView),
  options: {
    showClose: false
  }
})

7、模态页面更新样式

如果你想更新模态页面的样式,可以通过updateStyleDialogSheet方法进行更新。

TypeScript 复制代码
@Builder
function changeStyleSheetView(d: SheetData) {
  Column() {
    Text(d.title)
      .width("100%")
      .height(100)
      .textAlign(TextAlign.Center)
    Button("更改样式").onClick(() => {
      //其他属性不需要
      updateStyleDialogSheet({
        options: {
          backgroundColor: Color.Pink
        }
      })
    })
    Button("关闭")
      .margin({ top: 10 })
      .onClick(() => {
        closeDialogSheet()
      })
  }
}

export class SheetData {
  title?: string

  constructor(title?: string) {
    this.title = title
  }
}

8、模态页面更新数据

更新数据,通过updateDataDialogSheet方式来更新,传递不同数据即可。

TypeScript 复制代码
let sheetData1 = new SheetData("模态页面更新数据,3秒后我就会更新")
let sheetWrap1 = wrapBuilder(changeStyleSheetView)
showDialogSheet({
  layout: sheetWrap1,
  data: sheetData1
})
setTimeout(() => {
  updateDataDialogSheet(new SheetData("嘿嘿!我更新了~"))
}, 3000)

9、关闭模态页面

主动关闭页面,使用closeDialogSheet()方法进行关闭。

TypeScript 复制代码
let sheetData2 = new SheetData("测试关闭模态页面")
let sheetWrap2 = wrapBuilder(changeStyleSheetView)
showDialogSheet({
  layout: sheetWrap2,
  data: sheetData2
})

底部弹出动画组件数据更新

在之前的版本,如果你使用了BottomAnimationView做为根组件,来实现从底部的弹出动画,那么在使用自定义弹窗,使用updateDialogParams来更新数据时,是不生效的,因为组件做了层级嵌套,也就是绘制的UI是BottomAnimationView的子组件,数据呢也必须从BottomAnimationView中回调,否则数据是无法更新的,在最新版本已经优化了这一问题。

简单案例如下:

代码调用

TypeScript 复制代码
let params2 = new DialogParams()
        params2.title = "我是传递的参数"
        let builder2 = wrapBuilder(BottomBuilderDialogParams)
        showDialogParams(builder2, params2)
        clearTimeout(this.mTimeoutId)
        this.mTimeoutId = setTimeout(() => {
          let paramsBottom = new DialogParams()
          paramsBottom.title = "嘿嘿,我数据更新了"
          updateDialogParams(paramsBottom)
        }, 3000)

数据传递

数据传递主要通过BottomAnimationView定义的params属性。

TypeScript 复制代码
@Builder
function BottomChild(d: DialogData) {
  Column() {
    Text((d.data as DialogParams).title)
      .margin({ top: 30 })

    Row() {
      Button("取消").onClick(() => {
        //隐藏dialog
        hide()
      })
      Button("确定")
        .margin({ left: 30 })

    }.margin({ top: 20 })
    .margin({ top: 30 })
  }.backgroundColor(Color.White)
  .width("60%")
}

@Builder
function BottomBuilderDialogParams(params: DialogParams) {
  BottomAnimationView({
    params: params,
    layoutChild: wrapBuilder(BottomChild)
  })
}

相关总结

目前弹出库的下载量是六千四百多个,不算多,当然了在中心仓库中也不算少,希望大家在使用中,有问题多多提,也希望可以帮助到更多需要的人。

相关推荐
雨白7 小时前
Kotlin 协程的灵魂:结构化并发详解
android·kotlin
我命由我123457 小时前
Android 开发问题:getLeft、getRight、getTop、getBottom 方法返回的值都为 0
android·java·java-ee·android studio·android jetpack·android-studio·android runtime
Modu_MrLiu7 小时前
Android实战进阶 - 用户闲置超时自动退出登录功能详解
android·超时保护·实战进阶·长时间未操作超时保护·闲置超时
Jeled8 小时前
Android 网络层最佳实践:Retrofit + OkHttp 封装与实战
android·okhttp·kotlin·android studio·retrofit
信田君95278 小时前
瑞莎星瑞(Radxa Orion O6) 基于 Android OS 使用 NPU的图片模糊查找APP 开发
android·人工智能·深度学习·神经网络
tangweiguo030519878 小时前
Kotlin 实现 Android 网络状态检测工具类
android·网络·kotlin
nvvas9 小时前
Android Studio JAVA开发按钮跳转功能
android·java·android studio
怪兽20149 小时前
Android多进程通信机制
android·面试
叶羽西10 小时前
Android CarService调试操作
android
Bert丶seven10 小时前
鸿蒙Harmony实战开发教学(No.7)-Image组件基础到进阶篇
华为·harmonyos·arkts·鸿蒙·鸿蒙系统·arkui·开发教学