0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

三種自定義彈窗UI組件封裝的實(shí)現(xiàn)

OpenHarmony技術(shù)社區(qū) ? 來源:HarmonyOS技術(shù)社區(qū) ? 作者:HarmonyOS技術(shù)社區(qū) ? 2022-03-30 09:28 ? 次閱讀
鴻蒙已經(jīng)提供了全局 UI 方法自定義彈窗,本文是基于基礎(chǔ)的自定義彈窗來實(shí)現(xiàn)提示消息彈窗、確認(rèn)彈窗、輸入彈窗的 UI 組件封裝。

消息確認(rèn)彈窗


首先看下效果:


2c5e3360-af49-11ec-aa7f-dac502259ad0.png

首先先定義一個(gè)新的組件 ConfirmDialog

@CustomDialog
exportdefaultstructConfirmDialog{
title:string=''
content:string=''
confirmFontColor:string='#E84026'
cancelFontColor:string='#0A59F7'
confirmText:string='確認(rèn)'
cancelText:string='取消'
controller:CustomDialogController
cancel:()=>void
confirm:()=>void
build(){}
}
自定義確認(rèn)彈窗可自定義傳入的參數(shù)有:
  • 可選參數(shù)標(biāo)題 title(默認(rèn)值:“”),正文內(nèi)容 content(默認(rèn)值:“”),確認(rèn)按鈕字體顏色 confirmFontColor(默認(rèn)值:#E84026),取消按鈕字體顏色 cancelFontColor(默認(rèn)值:#0A59F7),確認(rèn)按鈕文案(默認(rèn)值:確認(rèn)),取消按鈕文案(默認(rèn)值:取消)

  • 必須參數(shù)自定義彈窗控制器 controller: CustomDialogController,確認(rèn)按鈕觸發(fā)事件 confirm(),取消按鈕觸發(fā)事件 cancel()

標(biāo)題、正文、按鈕封裝:一個(gè)確認(rèn)彈窗組件主要由標(biāo)題、正文等文本內(nèi)容和取消、確認(rèn)等按鈕事件組成。下面將分別對(duì)文案和按鈕通過**@Extend**裝飾器進(jìn)行封裝。

@Extend 裝飾器將新的屬性函數(shù)添加到內(nèi)置組件上,如 Text、Column、Button 等。通過**@Extend**裝飾器可以快速定義并復(fù)用組件的自定義樣式。

2c77f5d4-af49-11ec-aa7f-dac502259ad0.png

//標(biāo)題title與正文content自定義樣式
@Extend(Text)functionfancfontSize(fontSize:number){
.fontSize(fontSize)
.width('100%')
.fontColor('rgba(0,0,0,0.86)')
.textAlign(TextAlign.Center)
.padding({top:15,bottom:0,left:8,right:8})
.alignSelf(ItemAlign.Center)
.margin({top:16})
}

//取消、確認(rèn)按鈕自定義樣式
@Extend(Text)functionfancBtn(fontColor:string){
.fontColor(fontColor)
.backgroundColor(0xffffff)
.width(188)
.height(29)
.fontSize(22)
.textAlign(TextAlign.Center)
}

本示例僅標(biāo)題與正文僅支持字體大小 fontSize 自定義,按鈕僅支持按鈕文案字體顏色 fontColor 自定義,其他通用屬性皆是寫定的,若想支持其他屬性自定義,也可通過 fancfontSize() 添加新的參數(shù)。

其次,可以更進(jìn)一步的對(duì)標(biāo)題與正文通過 @Builder 裝飾器進(jìn)行封裝,且通過是否傳入 title、content 字段來判斷是否展示對(duì)應(yīng)文案。

@Builder 裝飾的方法用于定義組件的聲明式 UI 描述,在 一個(gè)自定義組件內(nèi)快速生成多個(gè)布局內(nèi)容。@Builder 裝飾方法的功能和語法規(guī)范與build 函數(shù)相同。

//文案樣式
@BuilderTipTextStyle(tip:string,fontSize:number){
Text(tip)
.fancfontSize(fontSize)
.visibility(tip.length>0?Visibility.Visible:Visibility.None)
}

注意:
  • @Extend 裝飾器的內(nèi)容必須寫在 ConfirmDialog{} 組件外,且在 @Extend 裝飾器聲明的基礎(chǔ)內(nèi)置組件的方法之前不能出現(xiàn)用/*多行注釋(會(huì)報(bào)錯(cuò)),但可采用單行注釋//。

  • @Builder 裝飾器的內(nèi)容要寫在 ConfirmDialog{} 組件內(nèi),build(){} 外 。

  • @Builder 裝飾器聲明的自定義組件內(nèi)部可包含 @Extend 聲明的自定義樣式的基礎(chǔ)組件,但是 @Extend 內(nèi)部不可包含 @Builder 裝飾器聲明的自定義組件。

ConfirmDialog 組件完整代碼:

//取消、確認(rèn)按鈕自定義樣式
@Extend(Text)functionfancBtn(fontColor:string){
.fontColor(fontColor)
.backgroundColor(0xffffff)
.width(188)
.height(29)
.fontSize(22)
.textAlign(TextAlign.Center)
}
//標(biāo)題title與正文content自定義樣式
@Extend(Text)functionfancfontSize(fontSize:number){
.fontSize(fontSize)
.width('100%')
.fontColor('rgba(0,0,0,0.86)')
.textAlign(TextAlign.Center)
.padding({top:15,bottom:0,left:8,right:8})
.alignSelf(ItemAlign.Center)
.margin({top:16})
}
@CustomDialog
exportdefaultstructConfirmDialog{
title:string=''
content:string=''
confirmFontColor:string='#E84026'
cancelFontColor:string='#0A59F7'
confirmText:string='確認(rèn)'
cancelText:string='取消'
controller:CustomDialogController
cancel:()=>void
confirm:()=>void
//標(biāo)題、正文文案樣式
@BuilderTipTextStyle(tip:string,fontSize:number){
Text(tip)
.fancfontSize(fontSize)
.visibility(tip.length>0?Visibility.Visible:Visibility.None)
}

build(){
Column(){
this.TipTextStyle(this.title,28)
this.TipTextStyle(this.content,22)
Flex({justifyContent:FlexAlign.SpaceAround}){
Text(this.cancelText)
.fancBtn(this.cancelFontColor)
.onClick(()=>{
this.controller.close()
this.cancel()
})
Text(this.confirmText)
.fancBtn(this.confirmFontColor)
.onClick(()=>{
this.controller.close()
this.confirm()
})
}.margin({top:30,bottom:16,left:16,right:16})
}
}
}

引用頁面代碼:

importConfirmDialogfrom'./components/dialog/ConfirmDialog.ets'
@Entry
@Component
structIndexComponent{
//確認(rèn)彈窗
privatetitle:string='標(biāo)題'
privatecontent:string='此操作將永久刪除該文件,是否繼續(xù)?'
privateconfirmText:string='刪除'
ConfirmDialogController:CustomDialogController=newCustomDialogController({
builder:ConfirmDialog({cancel:this.onCancel,confirm:()=>{
this.onAccept()
},title:this.title,content:this.content}),
cancel:this.onCancel,
autoCancel:true
})
//點(diǎn)擊取消按鈕或遮罩層關(guān)閉彈窗
onCancel(){
console.info('取消,關(guān)閉彈窗')
}
//點(diǎn)擊確認(rèn)彈窗
onAccept(){
console.info('確認(rèn),關(guān)閉彈窗')
}
build(){
Scroll(){
Column(){
Text('確認(rèn)彈窗')
.fontSize(24)
.width(300)
.height(60)
.border({width:5,color:0x317AF7,radius:10,style:BorderStyle.Solid})
.margin({top:20,bottom:10})
.textAlign(TextAlign.Center)
.onClick(()=>{
this.ConfirmDialogController.open()
})
}
.width('100%')
}
}
}

消息提示彈窗

首先看下效果:

2c88cdf0-af49-11ec-aa7f-dac502259ad0.png

首先先定義一個(gè)新的組件 PromptDialog:

@CustomDialog
exportdefaultstructPromptDialog{
controller:CustomDialogController
ancel:()=>void
build(){}
}
至于標(biāo)題、正文、按鈕文案及按鈕顏色的封裝均與消息確認(rèn)彈窗一樣,同 1.2 所述。

PromptDialog 組件完整代碼:

//標(biāo)題title與正文content自定義樣式
@Extend(Text)functionfancfontSize(fontSize:number){
.fontSize(fontSize)
.width('100%')
.fontColor('rgba(0,0,0,0.86)')
.textAlign(TextAlign.Center)
.padding({top:15,bottom:0,left:8,right:8})
.alignSelf(ItemAlign.Center)
.margin({top:16})
}
//底部按鈕自定義樣式
@Extend(Text)functionfancBtn(fontColor:string){
.backgroundColor(0xffffff)
.fontColor(fontColor)
.width(188)
.height(29)
.fontSize(22)
.textAlign(TextAlign.Center)
}
@CustomDialog
exportdefaultstructPromptDialog{
controller:CustomDialogController
cancel:()=>void
//標(biāo)題、正文文案樣式
@BuilderTipTextStyle(tip:string,fontSize:number){
Text(tip)
.fancfontSize(fontSize)
.visibility(tip.length>0?Visibility.Visible:Visibility.None)
}

build(){
Column(){
this.TipTextStyle($s('strings.title'),28)
this.TipTextStyle($s('strings.content'),22)
Flex({justifyContent:FlexAlign.Center}){
Text($s('strings.confirm'))
.fancBtn(0x0A59F7)
.onClick(()=>{
this.controller.close()
})
}.margin({top:30,bottom:16})
}
}
}

若標(biāo)題 title 與正文 content 中的文案是固定的,可如此示例一樣,可采用寫入到 resource 中的 zh_CN 和 en_US 文件中,通過 $s(‘strings.title’) 取值顯示,若是動(dòng)態(tài)獲取的,可采用消息確認(rèn)彈窗中傳參方式。

2c993730-af49-11ec-aa7f-dac502259ad0.png

引用頁面代碼:

importPromptDialogfrom'./components/dialog/PromptDialog.ets'
@Entry
@Component
structIndexComponent{
//消息提示彈窗
PromptDialogController:CustomDialogController=newCustomDialogController({
builder:PromptDialog(),
autoCancel:true
})

build(){
Scroll(){
Column(){
Text('消息提示彈窗')
.fontSize(24)
.width(300)
.height(60)
.border({width:5,color:0x317AF7,radius:10,style:BorderStyle.Solid})
.margin({top:20,bottom:10})
.textAlign(TextAlign.Center)
.onClick(()=>{
this.PromptDialogController.open()
})
}
.width('100%')
}
}
}

消息輸入彈窗

首先看下效果:

2cbbc26e-af49-11ec-aa7f-dac502259ad0.png

首先先定義一個(gè)新的組件 InputDialog:

exportdefaultstructInputDialog{
title:string=''
content:string=''
@StateinputString:string=''
controller:CustomDialogController
cancel:()=>void
confirm:(data)=>void

build(){}
}
此示例講述了子組件通過事件觸發(fā)傳參給父組件的方法,例如:在子組件用 @state 聲明輸入框內(nèi)容 inputString,通過 confirm 事件傳參給父組件,可支持在父組件至于標(biāo)題、正文、按鈕文案及按鈕顏色的封裝均與消息確認(rèn)彈窗一樣,同 1.2 所述。

PromptDialog 組件完整代碼:

//取消、確認(rèn)按鈕自定義樣式
@Extend(Text)functionfancBtn(fontColor:string){
.fontColor(fontColor)
.backgroundColor(0xffffff)
.width(188)
.height(29)
.fontSize(22)
.textAlign(TextAlign.Center)
}
//標(biāo)題title與正文content自定義樣式
@Extend(Text)functionfancfontSize(fontSize:number){
.fontSize(fontSize)
.width('100%')
.fontColor('rgba(0,0,0,0.86)')
.textAlign(TextAlign.Start)
.padding({top:15,bottom:0,left:15,right:15})
.margin({top:16})
}
@CustomDialog
exportdefaultstructInputDialog{
title:string=''
content:string=''
@StateinputString:string=''
controller:CustomDialogController
cancel:()=>void
confirm:(data)=>void
//文案樣式
@BuilderTipTextStyle(tip:string,fontSize:number){
Text(tip)
.fancfontSize(fontSize)
.visibility(tip.length>0?Visibility.Visible:Visibility.None)
}

build(){
Column(){
this.TipTextStyle(this.title,28)
this.TipTextStyle(this.content,22)
//輸入框
TextInput()
.type(InputType.Normal)
.enterKeyType(EnterKeyType.Next)
.caretColor(Color.Green)
.height(44)
.margin({top:20,left:15;right:15})
.alignSelf(ItemAlign.Center)
.onChange((value:string)=>{
this.inputString=value
})
Flex({justifyContent:FlexAlign.SpaceAround}){
Text($s('strings.cancel'))
.fancBtn('#0A59F7')
.onClick(()=>{
this.controller.close()
this.cancel()
})
Text($s('strings.confirm'))
.fancBtn('#E84026')
.onClick(()=>{
this.controller.close()
console.log('inputString:'+this.inputString)
this.confirm(this.inputString)
})
}.margin({top:30,bottom:16,left:16,right:16})
}
}
}
2cd4ba08-af49-11ec-aa7f-dac502259ad0.png

引用頁面代碼:

importInputDialogfrom'./components/dialog/InputDialog.ets'
@Entry
@Component
structIndexComponent{

//輸入彈窗
privatetext:string='提示'
privatelabel:string='請(qǐng)輸入您的姓名'
InputDialogController:CustomDialogController=newCustomDialogController({
builder:InputDialog({cancel:this.onCancel,confirm:(data)=>{
this.confirm(data)
},title:this.text,content:this.label}),
cancel:this.onCancel,
autoCancel:true
})
//點(diǎn)擊取消按鈕或遮罩層關(guān)閉彈窗
onCancel(){
console.info('取消,關(guān)閉輸入彈窗')
}
//點(diǎn)擊確認(rèn)彈窗
confirm(data){
console.info('確認(rèn),關(guān)閉輸入彈窗,data:'+data)
}

build(){
Scroll(){
Column(){
Text('輸入彈窗')
.fontSize(24)
.width(300)
.height(60)
.border({width:5,color:0x317AF7,radius:10,style:BorderStyle.Solid})
.margin({top:20,bottom:10})
.textAlign(TextAlign.Center)
.onClick(()=>{
this.InputDialogController.open()
})
}
.width('100%')
}
}
}

總結(jié)

本文僅僅實(shí)現(xiàn)了三種自定義彈窗 UI 組件的封裝(傳參方式也講解了多種,具體傳參方式可視具體情況而定),待筆者優(yōu)化了功能、代碼后在來與大家分享, 在最后歡迎鴻蒙各位大佬指教。

原文標(biāo)題:在鴻蒙上實(shí)現(xiàn)3種自定義彈窗UI組件封裝

文章出處:【微信公眾號(hào):HarmonyOS技術(shù)社區(qū)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

審核編輯:湯梓紅
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 封裝
    +關(guān)注

    關(guān)注

    126

    文章

    7728

    瀏覽量

    142598
  • 組件
    +關(guān)注

    關(guān)注

    1

    文章

    503

    瀏覽量

    17784
  • 鴻蒙
    +關(guān)注

    關(guān)注

    57

    文章

    2302

    瀏覽量

    42689

原文標(biāo)題:在鴻蒙上實(shí)現(xiàn)3種自定義彈窗UI組件封裝

文章出處:【微信號(hào):gh_834c4b3d87fe,微信公眾號(hào):OpenHarmony技術(shù)社區(qū)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    HarmonyOS開發(fā)實(shí)例:【自定義Emitter】

    使用[Emitter]實(shí)現(xiàn)事件的訂閱和發(fā)布,使用[自定義彈窗]設(shè)置廣告信息。
    的頭像 發(fā)表于 04-14 11:37 ?954次閱讀
    HarmonyOS開發(fā)實(shí)例:【<b class='flag-5'>自定義</b>Emitter】

    HarmonyOS開發(fā)案例:【彈窗使用】

    基于dialog和button組件,實(shí)現(xiàn)彈窗的幾種自定義效果
    的頭像 發(fā)表于 04-25 17:44 ?1233次閱讀
    HarmonyOS開發(fā)案例:【<b class='flag-5'>彈窗</b>使用】

    HarmonyOS開發(fā)案例:【 自定義彈窗

    基于ArkTS的聲明式開發(fā)范式實(shí)現(xiàn)三種不同的彈窗,第一直接使用公共組件,后兩使用Custo
    的頭像 發(fā)表于 05-16 18:18 ?1234次閱讀
    HarmonyOS開發(fā)案例:【 <b class='flag-5'>自定義</b><b class='flag-5'>彈窗</b>】

    HarmonyOS實(shí)戰(zhàn)開發(fā)-全局彈窗封裝案例

    介紹 本示例介紹兩彈窗封裝案例。一自定義彈窗封裝
    發(fā)表于 05-08 15:51

    HarmonyOS實(shí)戰(zhàn)開發(fā)-深度探索與打造個(gè)性化自定義組件

    ,容器組件,媒體組件,繪制組件,畫布組件組件等,如Button、Text 是基礎(chǔ)組件。 由開發(fā)者
    發(fā)表于 05-08 16:30

    OpenHarmony應(yīng)用開發(fā)之自定義彈窗

    以??橘子購(gòu)物??中一個(gè)應(yīng)用更新提示的彈窗介紹OpenHarmony的自定義彈窗。 接口 自定義彈窗官方文檔:??
    發(fā)表于 09-06 14:40

    OpenHarmony自定義組件介紹

    代碼可復(fù)用性、業(yè)務(wù)邏輯與UI分離,后續(xù)版本演進(jìn)等因素。因此,將UI和部分業(yè)務(wù)邏輯封裝自定義組件是不可或缺的能力。
    發(fā)表于 09-25 15:36

    深度解讀HarmonyOS自定義UI組件的使用

    。 Component 是繪制在屏幕上的一個(gè)對(duì)象,用戶能與之交互。Java UI框架提供了創(chuàng)建UI界面的各類組件,比如:文本、按鈕、圖片、列表等。每個(gè)組件通過對(duì)數(shù)據(jù)和方法的簡(jiǎn)單
    的頭像 發(fā)表于 09-16 09:30 ?1795次閱讀
    深度解讀HarmonyOS<b class='flag-5'>自定義</b><b class='flag-5'>UI</b><b class='flag-5'>組件</b>的使用

    鴻蒙上自定義組件的過程

    特性的組件,通過擴(kuò)展 Component 或其子類實(shí)現(xiàn),可以精確控制屏幕元素的外觀,實(shí)現(xiàn)開發(fā)者想要達(dá)到的效果,也可響應(yīng)用戶的點(diǎn)擊、觸摸、長(zhǎng)按等操作。 ? 下面通過自定義一個(gè)仿微信朋友圈
    的頭像 發(fā)表于 11-10 09:27 ?2821次閱讀
    鴻蒙上<b class='flag-5'>自定義</b><b class='flag-5'>組件</b>的過程

    OpenHarmony自定義組件FlowImageLayout

    組件介紹 本示例是OpenHarmony自定義組件FlowImageLayout。 用于將一個(gè)圖片列表以瀑布流的形式顯示出來。 調(diào)用方法
    發(fā)表于 03-21 10:17 ?3次下載
    OpenHarmony<b class='flag-5'>自定義</b><b class='flag-5'>組件</b>FlowImageLayout

    OpenHarmony自定義組件CircleProgress

    組件介紹 本示例是OpenHarmony自定義組件CircleProgress。 用于定義一個(gè)帶文字的圓形進(jìn)度條。 調(diào)用方法
    發(fā)表于 03-23 14:06 ?4次下載
    OpenHarmony<b class='flag-5'>自定義</b><b class='flag-5'>組件</b>CircleProgress

    適用于鴻蒙的自定義組件框架Carbon案例教程

    項(xiàng)目名稱:Carbon 所屬系列:ohos的第組件適配移植 功能:一個(gè)適用于鴻蒙的自定義組件框架,幫助快速實(shí)現(xiàn)各種需要的效果 項(xiàng)目移植狀
    發(fā)表于 04-07 09:49 ?5次下載

    自定義視圖組件教程案例

    自定義組件 1.自定義組件-particles(粒子效果) 2.自定義組件- pulse(脈沖b
    發(fā)表于 04-08 10:48 ?14次下載

    ArkUI如何自定義彈窗(eTS)

    自定義彈窗其實(shí)也是比較簡(jiǎn)單的,通過CustomDialogController類就可以顯示自定義彈窗
    的頭像 發(fā)表于 08-31 08:24 ?2097次閱讀

    鴻蒙ArkUI實(shí)例:【自定義組件

    組件是 OpenHarmony 頁面最小顯示單元,一個(gè)頁面可由多個(gè)組件組合而成,也可只由一個(gè)組件組合而成,這些組件可以是ArkUI開發(fā)框架自帶系統(tǒng)
    的頭像 發(fā)表于 04-08 10:17 ?578次閱讀