成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

OpenHarmony應用開發之自定義彈窗

系統 OpenHarmony
在應用的使用和開發中,彈窗是一個很常見的場景,自定義彈窗又因為極高的自由度得以廣泛應用。本文以橘子購物中一個應用更新提示的彈窗介紹OpenHarmony的自定義彈窗。

想了解更多關于開源的內容,請訪問:

51CTO 開源基礎軟件社區

https://ost.51cto.com

應用場景

在應用的使用和開發中,彈窗是一個很常見的場景,自定義彈窗又因為極高的自由度得以廣泛應用。本文以橘子購物中一個應用更新提示的彈窗介紹OpenHarmony的自定義彈窗。

OpenHarmony應用開發之自定義彈窗-開源基礎軟件社區OpenHarmony應用開發之自定義彈窗-開源基礎軟件社區

接口

自定義彈窗官方文檔:自定義彈窗-彈窗-全局UI方法-組件參考(基于ArkTS的聲明式開發范式)-ArkTS API參考-HarmonyOS應用開發。

CustomDialogController是自定義彈窗對應的接口,詳細介紹如下:

CustomDialogController(value:{builder: CustomDialog, cancel?: () => void, autoCancel?: boolean, alignment?: DialogAlignment, 
                      offset?: Offset, customStyle?: boolean, gridCount?: number, maskColor?: ResourceColor, 
                      openAnimation?: AnimateParam, closeAnimation?: AnimateParam})

參數:

參數名

參數類型

必填

參數描述

builder

CustomDialog

自定義彈窗內容構造器。

cancel

() => void

點擊遮障層退出時的回調。

autoCancel

boolean

是否允許點擊遮障層退出。默認值:true

alignment

DialogAlignment

彈窗在豎直方向上的對齊方式。默認值:DialogAlignment.Default

offset

Offset

彈窗相對alignment所在位置的偏移量。

customStyle

boolean

彈窗容器樣式是否自定義。默認值:false,彈窗容器的寬度根據柵格系統自適應,

不跟隨子節點;高度自適應子節點,最大為窗口高度的90%;圓角為24vp。

gridCount8+

number

彈窗寬度占柵格寬度的個數。默認為按照窗口大小自適應,異常值按默認值處理,

最大柵格數為系統最大柵格數。

這其中最重要的就是builder,我們需要自己實現一個構造器,也就是這個彈窗的頁面。

具體實現

定義CustomDialogController

首先,我們需要定義一個CustomDialogController:

UpdateDialogController: CustomDialogController = new CustomDialogController({
  builder: UpdateDialog(),
  customStyle: true
})

這個CustomDialogController就代表彈窗,UpdateDialog()是彈窗的具體實現,customStyle為ture就表示彈窗樣式可以自定義。

設置調用時機

在這個場景中,我們想要每次打開應用的時候彈窗,其他時候不彈窗,我們需要在首頁組件的aboutToAppear中加入以下代碼:

aboutToAppear() {
  if(AppStorage.Get('nowIndex') === undefined || AppStorage.Get('nowIndex') === 0){
    this.UpdateDialogController.open()
  }
}

aboutToAppear函數的調用時機是創建自定義組件的新實例后,執行其build()函數之前,所以在首頁組件的aboutToAppear加入CustomDialogController的打開開邏輯可使彈窗僅在應用打開的時候觸發。

aboutToAppear參考文檔:自定義組件的生命周期-組件參考(基于ArkTS的聲明式開發范式)-ArkTS API參考-HarmonyOS應用開發。

實現builder實例

實現實例可以直接在builder后面直接實現,也可以定義在其他文件中,然后通過調用的方式獲取,本文以調用方式實現。

實例組件的定義前需加export才能暴露出去:

export struct UpdateDialog {}

彈窗上所需的數據和獲取也需要在在此處定義:

@CustomDialog
export struct UpdateDialog {
  @State currentVersion: string = ''
  @State richTextData: string = ''
  @State lastVersion: string = ''
  @State updateContent: string = ''
  private context?: AbilityContext
  private customDialogController?: CustomDialogController

  async aboutToAppear() {
    this.context = getContext(this) as AbilityContext
    this.richTextData = await dialogFeature.getRichTextData(this.context)
    Logger.info(TAG, `this.richTextData = ${this.richTextData}`)
    await this.getData()
  }

  async getData() {
    try {
      this.currentVersion = await dialogFeature.getCurrentVersion()
      let requestResponseContent: RequestResponseContent = await dialogFeature.getLastVersion()
      if (requestResponseContent.content === null || requestResponseContent.content === undefined) {
        return
      }
      this.updateContent = requestResponseContent.content
      if (requestResponseContent.versionName === null || requestResponseContent.versionName === undefined) {
        return
      }
      this.lastVersion = requestResponseContent.versionName
    } catch (err) {
      Logger.info(TAG, `getApplicationVersion is fail`)
    }
  }
  ...

以上是應用升級所需的數據結構及部分數據獲取。

彈窗具體實現

自定義彈窗的實現就是在原頁面的基礎上再加一層頁面,頁面內容自定義。

彈窗頁面我們可以通過stack組件實現,stack組件會使容器內的子組件堆疊布局,使用stack的好處是可以添加一層遮罩效果。

Stack() {
  // mask 遮罩層
  Column()
    .width('100%')
    .height('100%')
    .backgroundColor('#000000')
    .opacity(.4)
    
...

以上代碼在stack的第一層設置了backgroundColor和opacity屬性,這樣會產生如開始示意圖的遮罩效果。

需要注意的是,需要在取消按鈕的調用函數中關閉彈窗,具體代碼如下:

Button($r('app.string.cancel'))
  .onClick(() => {
    this.customDialogController.close()
  })

彈窗完整代碼:

build() {
  Stack() {
    // mask 遮罩層
    Column()
      .width('100%')
      .height('100%')
      .backgroundColor('#000000')
      .opacity(.4)
    Column() {
      Stack({ alignContent: Alignment.TopStart }) {
        Text($r('app.string.update_title'))
          .fontSize(30)
          .fontColor('#FFFFFF')
          .fontWeight(500)
          .margin({ top: 70, left: 76 })

        Text(`V${(this.lastVersion || updateData.versionName)}`)
          .fontSize(16)
          .backgroundColor('#FFFFFF')
          .textAlign(TextAlign.Center)
          .fontColor('#E9304E')
          .borderRadius(20)
          .width(80)
          .aspectRatio(2.8)
          .margin({ top: 110, left: 76 })

        Column() {
          // 富文本容器
          Scroll() {
            Column() {
              if (this.richTextData) {
                RichText((this.updateContent || this.richTextData))
                  .width('100%')
                  .height('100%')
              }
            }
            .width('100%')
          }
          .height(200)

          Row() {
            Button($r('app.string.cancel'))
              .commonButtonStyle()
              .fontSize(20)
              .margin({ left: 10 })
              .fontColor('#E92F4F')
              .backgroundColor('rgba(0,0,0,0.05)')
              .margin({ right: 10 })
              .onClick(() => {
                this.customDialogController.close()
              })
              .key("cancel")

            Button($r('app.string.update_now'))
              .commonButtonStyle()
              .fontSize(20)
              .margin({ right: 10 })
              .fontColor('#FFFFFF')
              .backgroundColor('#E92F4F')
              .margin({ left: 10 })
              .onClick(() => {
                this.customDialogController.close()
              })
              .key("Now")
          }
          .margin({ top: 30 })
        }
        .width('100%')
        .padding({ left: 25, right: 25 })
        .margin({ top: 230 })
      }
      .height(600)
      .width('100%')
      .backgroundImage($r('app.media.update'), ImageRepeat.NoRepeat)
      .backgroundImageSize(ImageSize.Contain)
    }
    .width(480)
    .padding({ left: 16, right: 16 })
  }
  .width('100%')
  .height('100%')
}

以上是彈窗完整代碼,需要注意的是,本例并未實現應用升級的具體邏輯,所以升級按鈕的操作也是關閉彈窗。

想了解更多關于開源的內容,請訪問:

51CTO 開源基礎軟件社區

https://ost.51cto.com

責任編輯:jianghua 來源: 51CTO 開源基礎軟件社區
相關推薦

2022-03-21 15:19:27

鴻蒙UI組件ets自定義

2022-06-30 14:02:07

鴻蒙開發消息彈窗組件

2023-06-27 15:02:47

2011-12-05 15:02:21

Knockout

2022-02-21 15:05:09

LauncherOpenHarmon鴻蒙

2015-02-11 17:49:35

Android源碼自定義控件

2011-08-02 11:17:13

iOS開發 View

2022-03-01 16:09:06

OpenHarmon鴻蒙單選組件

2011-08-11 11:51:07

iPhone鍵盤

2022-09-16 15:34:32

CanvasArkUI

2013-05-20 17:48:20

2022-10-17 14:39:12

自定義彈窗組件鴻蒙

2022-05-26 14:50:15

ArkUITS擴展

2013-05-20 17:33:44

Android游戲開發自定義View

2009-06-08 20:13:36

Eclipse自定義控

2022-04-11 11:07:37

HarmonyUI小型系統textarea

2011-08-18 09:44:33

iPhone SDK儀表控件UIDialView

2013-11-13 00:51:22

微信微信公號微信公眾賬號

2011-12-26 10:11:08

JSP

2009-06-24 15:13:36

自定義JSF組件
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 四虎伊人 | 日韩在线不卡 | 天天综合日日夜夜 | 日韩av高清在线 | 婷婷久久五月天 | 亚洲日韩中文字幕一区 | 欧美日韩在线免费 | 在线观看视频h | 国产xxxx搡xxxxx搡麻豆 | 华丽的挑战在线观看 | 在线中文一区 | 性色av一区 | 成人亚洲 | 一区视频 | 亚洲欧美综合精品另类天天更新 | 国产精品久久毛片av大全日韩 | 蜜桃精品视频在线 | 成人自拍av | 亚洲国产伊人 | 亚洲精品视频一区 | 91精品观看 | 成人三级影院 | 一二三四在线视频观看社区 | 亚洲 欧美 精品 | 国产精品久久久久久久久久久免费看 | 久久国产婷婷国产香蕉 | 久久久久国产一区二区三区四区 | 亚洲免费在线 | 四虎永久在线精品免费一区二 | 亚洲天堂av网 | 欧美视频在线一区 | 精品久久久久久亚洲综合网站 | 精品产国自在拍 | 天天操妹子 | 国产精品久久久久久久7电影 | 久久se精品一区精品二区 | 麻豆久久久久久久 | 亚洲综合视频 | av一级久久 | 天天搞天天操 | 国产成人精品久久二区二区91 |